救命啊!printer.Canvas.TextOut(1000,1000,'TEST');在不同打印机上,打印位置不同! ( 积分: 200 )

  • 主题发起人 主题发起人 若凡
  • 开始时间 开始时间

若凡

Unregistered / Unconfirmed
GUEST, unregistred user!
printer.Canvas.TextOut(1000,1000,'TEST');在不同打印机上,打印位置不同!
我要做的是票据的精确打印,位置差这么多,我该怎么办啊!神啊,救救我吧!
 
有人在吗?
 
不同的打印机分辨率是不同的, 设置打印分辨率应该可以解决问题.
以下函数提供一个参考
//在begin
Doc后调用
function SetPrinterScale(dpi : integer) : TPoint;
var
DeviceDpiX, DeviceDpiY : integer;
begin
with Printerdo
begin
SetMapMode(Handle, MM_ISOTROPIC);
SetWindowExt(Handle, dpi, dpi);
DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);
DeviceDpiY := GetDeviceCaps(Handle, LOGPIXELSY);
SetViewPortExt(Handle, DeviceDpiX, DeviceDpiY);
Result := Point(PageWidth, PageHeight);
with Canvasdo
begin
DPtoLP(Handle, Result, 1);
Font.PixelsPerInch := DPI;
end;

end;
end;
 
to 3868474
编不过去
DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);
[Error] Unit3.pas(63): Incompatible types: 'HDC' and 'QPainterH'
我用的是D7
 
有人在吗?
 
function SetPrinterScale(dpi : integer) : TPoint;
var
DeviceDpiX, DeviceDpiY : integer;
begin
with Printerdo
begin
SetMapMode(Handle, MM_ISOTROPIC);
windows.SetWindowExtEx(Handle, dpi, dpi, nil);
DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);
DeviceDpiY := GetDeviceCaps(Handle, LOGPIXELSY);
windows.SetViewportExtEx(Handle, DeviceDpiX, DeviceDpiY, nil);
Result := Point(PageWidth, PageHeight);
with Canvasdo
begin
DPtoLP(Handle, Result, 1);
Font.PixelsPerInch := DPI;
end;

end;
end;
 
如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printer?Canvas?rectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出0?6英寸宽、1?2英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。具体做法如下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printer?Handle,LOGPIXELSX);PointY:=GetDeviceCaps(printer?Handle,LOGPIXELSX);printer?Canvas?rectangle(0,0,PointX*1,PointY*2)这样,无论你使用什么样的打印机,都能得到一个1英寸宽、2英寸高的矩形。
 
哈哈,同行,看我的软件,这个问题是常见问题。
http://www.skycn.com/soft/33842.html
 
我的问题是打印发票(197mm*97mm)的时候,由于有一行'制票人'信息是在发票的最底部,我没有用控件,直接用的Printer.canvas.textout(X坐标,Y坐标,'刘德华'),结果这一行打印不出来,如果我把Y坐标改小一点,就可以打出来了,但是那样就没对齐,不符合要求,再慢慢把Y坐标调大到“制票人”那一行的上面某一行就打不出来,在请问如果想要打到“制票人”这一行我该如何解决?
 
建议用同一种打印方式打印,不建议用Printer.canvas.textout,因为打印结果随打印机的不同而不同!本人最后还是用的QuickReport!
 
后退
顶部