为什么将metafile上的图元stretchdraw到打印机上的canvas上会发生水平、垂直比例的失调?;(100分)

  • 主题发起人 主题发起人 数据狂
  • 开始时间 开始时间

数据狂

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么将metafile上的图元stretchdraw到打印机上的canvas上;
会发生水平、垂直比例的失调?
基本思路:
先建立一个Tmetafile类型的变量mf(因为Tmetafile类型的图元进行缩放时
不会失真),再建立一个Tmetafilecanvas类型的变量vc,然后将mf的宽度和高度
设置为当前打印纸的尺寸(按比例缩放后);然后在vc上画图、输出文字;
最后将vc上的图元StretchDraw到打印机的画布上进行打印输出。
同时将vc上的图元StretchDraw到一个Image上后,显示的结果和打印结果
一样出现比例失调,打印出来的文字不是正方形,字的高度为宽度的2倍左右。
为什么???
procedure TForm1.Button1Click(Sender: TObject);
var
mf:Tmetafile;
vc:Tmetafilecanvas;
rx,ry:real;
//打印机的canvas和mf的像素缩放比例
begin
rx:=GetDeviceCaps(printer.Handle,logPixelsX)/PixelsPerInch;
ry:=GetDeviceCaps(printer.Handle,logPixelsY)/PixelsPerInch;
mf:=Tmetafile.Create;
mf.Width:=trunc(printer.PageWidth/rx);
mf.Height:=trunc(printer.PageHeight/ry);

mf.Clear;
vc:=Tmetafilecanvas.Create(mf,0);
vc.Brush.Color:=clwhite;
vc.Font.Size:=12;
vc.TextOut(50,50,'设计程序');
vc.Free;
printer.begin
Doc;
printer.Canvas.StretchDraw(
rect(0,0,printer.PageWidth,printer.PageHeight),mf);
printer.EndDoc;
end;

[:(!]
 
强烈关注
 
我已经找到答案了!
metafilecanvas的画布尺寸与所使用的create方法有关:
vc:=Tmetafilecanvas.Create(mf,0)表示vc的画布尺寸与显示器的分辨率相同,我使用的
是800x600的分辨率,而打印纸是A4打印纸,360x360DPI,这样在StrechDraw时将800x600
的画布拉伸为A4打印纸大小,而A4打印纸是高比宽大,因此发生的失真。
应该将StrechDraw的宽、高进行比例缩放才能保证不失真。
 
后退
顶部