如何在不同的打印机上打印(100分)

  • 主题发起人 主题发起人 arlock
  • 开始时间 开始时间
A

arlock

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位大虾,printer.Canvas.TextOut(X,Y,String);中的X和Y是否是打印纸的绝对位置,
还是相对位置.如果在不同的打印机上打印应如何使用TextOut.
 
LQ1600K与HP打印机打印是否一样!?
 
X,Y只是一个坐标值。
在不同分辩的打印机上,需要进行缩放,请参照以下代码:
Printer.begin
Doc;
//获得打印机分辩
px:=ROUND(GETDEVICECAPS(PRINTER.CANVAS.HANDLE,LOGPIXELSX)/72);
pY:=ROUND(GETDEVICECAPS(PRINTER.CANVAS.HANDLE,LOGPIXELSY)/72);

//打印标题
PRINTER.Canvas.Font.Name:='楷体';
PRINTER.Canvas.Font.Size:=16;
I := 3;
Printer.Canvas.TextOut(PX*70*3,PY*40, 'xxxxxxxx管理系统');
PRINTER.Canvas.Font.Name:='黑体';
PRINTER.Canvas.Font.Size:=22;
Printer.Canvas.TextOut(PX*70*4,PY*70, '考场考生安排表');
PRINTER.Canvas.Font.Size:=12;
while not MDATA.DataModule1.tkcxx.EOFdo

begin

//判断是否到尾
IF PRINTER.Canvas.PenPos.Y>=PY*72*11 then

begin

PRINTER.Canvas.TextOut(PX*72*5,ROUND(PY*72*12.5),'第'+INTTOSTR(PRINTER.PageNumber)+'页');
PRINTER.Canvas.TextOut(PX*72*8,ROUND(PY*72*12.5),DATETOSTR(NOW));

 
我的思路是:
1、获取打印机分辨率:
dpi: Word;
//全局变量

dpi := GetDeviceCaps(Printer.Handle, LogPixelsX);
//由于大多数情况下水平和垂直分辨率相同,故此处省略获取垂直分辨率的部分

2、输出位置:
OutX,OutY: Word;
//全局变量, 以0.1毫米为单位
Printer.Canvas.TextOut(MMToDot(OutX), MMToDot(OutY), '输出文本');

function MMToDot(Value: Integer): Integer;
var Tmp: Real;
begin

Tmp := Value / 254 * dpi;
Result := Round(Tmp);
end;

 
以Printer的PageWidth,PageHeight为基准,
所有坐标都应是这两个值的相对值。
 
多人接受答案了。
 
后退
顶部