画布打印的问题,应该很多人都遇到过,请高手解决,谢谢!(100分)

  • 主题发起人 主题发起人 wxl82721
  • 开始时间 开始时间
W

wxl82721

Unregistered / Unconfirmed
GUEST, unregistred user!
var
DMode: PDevMode;
h: THandle;
Device, Drive, Port: PChar;
OldLeft: Integer;
begin
with Printerdo
begin

Device := StrAlloc(255);
Drive := StrAlloc(255);
Port := StrAlloc(255);
GetPrinter(Device, Drive, Port, h);
DMode := LocalLock(h);

DMode.dmPaperSize := 256;
DMode.dmPaperLength := 2100;
DMode.dmPaperWidth := 2000;
LocalUnLock(h);
SetPrinter(Device, Drive, Port, h);
StrDispose(Device);
StrDispose(Drive);
StrDispose(Port);
begin
Doc;
OldLeft := MainPanel.Left;
MainPanel.Left := 1500;
try
MainPanel.ScaleBy(200, 100);
MainPanel.PaintTo(Handle, 30, 10);
MainPanel.ScaleBy(100, 200);
finally
MainPanel.Left := OldLeft;
end;
EndDoc;
end;
.................
end;

以上代码实现Panel中打印,用针式打印机可以打印正常,但用喷墨,激光打印机
打印出来的内容就非常小,不是针式打印机打印出来的实际尺寸,请大虾赐教,谢谢!
 
这是因为分辨率的问题。
用pcdpi:=getdevicecaps(getdc(0),LOGPIXELSX)取得计算机屏幕的x向分辨率
用prdpi:=getdevicecaps(printer.handle,LOGPIXELSX)取得打印机x向分辨率。
返回的都是每英寸的像素点个数。
要想打印一个n英寸的长的图形在屏幕上显示1英寸的东西
canvas.move(0,0);
canvas.lineto(pcdpi*n,0);
我们在屏幕上画了一条n英寸的横向直线(可以用尺子量)
如果希望打印出来的也是n英寸那么
printer.canvas.move(0,0);
canvas.lineto(prdpi*n,0);
这样就能够做到所见即所得的样子了。(这样就和屏幕上的长度一样了)
//===============
应该修改:
var
pcdpi,prdpi:integer;
natio:integer;
.....
begin
Doc;
{这里以x轴大小为例,还可以取得y的分辨率}
pcdpi:=getdevicecaps(getdc(0),LOGPIXELSX);
prdpi:=getdevicecaps(printer.handle,LOGPIXELSX);
natio:=round(prdpi/pcdpi);
OldLeft := MainPanel.Left*natio;
MainPanel.Left := 1500*natio;
try
MainPanel.ScaleBy(200*natio, 100*natio);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100*natio, 200*natio);
finally
MainPanel.Left := OldLeft*natio;
end;
EndDoc;
////////////////////
不知道打印时你还作了什么,但是基本思路就是这样。
lz看看
 
试过了还是不行,打印出来还是非常的小,是不是我上面其中的这个代码有问题。

with Printerdo
begin

Device := StrAlloc(255);
Drive := StrAlloc(255);
Port := StrAlloc(255);
GetPrinter(Device, Drive, Port, h);
DMode := LocalLock(h);

DMode.dmPaperSize := 256;
DMode.dmPaperLength := 2100;
DMode.dmPaperWidth := 2000;
LocalUnLock(h);
SetPrinter(Device, Drive, Port, h);
StrDispose(Device);
StrDispose(Drive);
StrDispose(Port);
..............
...........
end;
 
DMode.dmPaperSize := 256*natio;
DMode.dmPaperLength := 2100*natio;
DMode.dmPaperWidth := 2000*natio;
总之,要想打印出屏幕上一样大小的东西,必须重新设定像素个数,都要*natio,
这样才能打印出和屏幕上显示的同样大小。
 
问题已经解决,产生原因有下面产生
MainPanel.ScaleBy(200*natio, 100*natio);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100*natio, 200*natio);
改为
MainPanel.ScaleBy(100*natio, 100);
MainPanel.PaintTo(Handle, 30*natio, 10*natio);
MainPanel.ScaleBy(100 , 100*natio);
 
多人接受答案了。
 
后退
顶部