如果我没记错的话,printer的pagewidth和pageheight是以像数恒量的,指的是可绘的区域(扣除那些页边距等),physicalwidth(physicalheight)也是指像数点数,指的是物理纸张的总的大小(相比printer的pagewidth(pageheight)要加上页的边距)这就是说它会显示很大,如果你的打印机的DPI设得高的话,logpixelsx
就是指DPI(dots per inch),因此当你打一个位图时,要注意一下区域大小的变换,有时当位图较大而打印机的dpi设得很高,如720,1440,用delphi中TBitmap的stretchdraw往往打不出来(在win16下我用D1有这情况,95情况不知道),这时要直接用到API,举个打图的例子,希望对你有所帮助:
//以下的例子适用于高分辩率的打印机,我不知道有没有比一般屏幕分辨率小的打印机
//如针打
procedure DrawImage(Canvas: TCanvas;
DestRect: TRect;
ABitmap:TBitmap);//打印一个位图
var
Header, Bits: Pointer;
HeaderSize: Integer;
BitsSize: Longint;
begin
GetDIBSizes(ABitmap.Handle, HeaderSize, BitsSize);
GetMem(Header,HeaderSize);
GetMem(Bits,BitsSize);
try
GetDIB(ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
StretchDIBits(Canvas.Handle,
DestRect.Left,
DestRect.Top,
DestRect.Right-DestRect.Left+1,
DestRect.Bottom-DestRect.Top+1,
0,
0,
ABitmap.Width,
ABitmap.Height,
Bits,
TBitmapInfo(Header^),
DIB_RGB_COLORS,
SRCCOPY);
finally
FreeMem(Header, HeaderSize);
FreeMem(Bits, BitsSize);
end;
end;
procedure PrintABmp(ABitmap:TBitmap)
//假设ABitmap是一个已有内容的位图,下面将该位图按屏幕大小(一倍的比例)打印
//在纸的正中间
var
DestRect:TRect;
//打在纸上的区域
XScale,YScale:Integer;
//并不精确的比例,有必要的话可以用浮点数
begin
Printer.begin
Doc;
XScale:=GetDeviceCaps(Printer.Handle,LOGPIXELSX) div
Screen.PixelsPerInch;
YScale:=GetDeviceCaps(Printer.Handle,LOGPIXELSY) div
Screen.PixelsPerInch;
DestRect.Left:=(Printer.PageWidth-ABitmap.Width*XScale) div 2;
DestRect.Top:=(Printer.PageHeight-ABitmap.Height*YScale) div 2;
DestRect.Right:=DestRect.Left+ABitmap.Width*XScale;
DestRect.Bottom:=DestRect.Top+Abitmap.Height*YScale;
DrawImage(Printer.Canvas,DestRect,ABitmap);
Printer.EndDoc;
end;
对于字体,也是一样要注意一下比例,否则当打印机的dpi设高的话,还按屏幕的字体
大小打,会很小的.