套打为什么会错位?敬请各位大虾赐教!!! (200分)

  • 主题发起人 主题发起人 xiezhaohui
  • 开始时间 开始时间
X

xiezhaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是测试的全部源代码,在执行时如果用EpsonLQ-1600K,打印位置正常,但是如果
换成 HpLaserJet6L-Pro激光机,打印结果错位,10cm(Y轴)左右时,能扩大2mm,X轴也错位
换用EsponVP-1850,也有错位。请各位大虾指点。
procedure TForm1.Button1Click(Sender: TObject);
var
px,py:int64;
begin
printer.begin
Doc;
px:=GETDEVICECAPS(PRINTER.HANDLE,LOGPIXELSX);
py:=GETDEVICECAPS(PRINTER.HANDLE,LOGPIXELSY);
px:=round(px/2.54);
py:=round(py/2.54);
printer.canvas.textout(round(0.5*px),round(0.5*py),'this is (5mm,5mm)-----------------------------------');
printer.canvas.textout(round(0.5*px),round(10.5*py),'this is (5mm,105mm)');
printer.canvas.textout(round(0.5*px),round(20.5*py),'this is (5mm,205mm)');
printer.canvas.textout(round(10.0*px),round(20.5*py),'this is (100mm,205mm)');
printer.EndDoc;
end;
附:
打印机的参数:(不知道这些参数有没有用)
Epson 1600k HP Laserjet
LOGPIXELSX 180 600
LOGPIXELSY 180 600
HORZRES 1488 4690
VERTRES 2104 7014
PHYSICALWIDTH 1488 4676
PHYSICALHEIGHT 2104 6814
PHYSICALOFFSETX 0 100
PHYSICALOFFSETY 0 142

 
对不同打印机使用不同配置
 
可能是四舍五入造成的计算误差。
试试
printer.canvas.textout(round(0.5*px/2.54),round(10.5*py/2.54),'this is (5mm,105mm)'
 
[h1]这是我的代码: 祝你好运;[/h1]
//******************* GetMM_Rate_Pixel *************************
//获取打印机的每毫米多少点 比LOGPIXELSX 要精确一些。
// XorY : 为X 时表示取X轴 Y是代表取Y轴
//返回的值可以直接用于转化毫米到打印机像素点。
// 比如 :GetMM_Rate_Pixel('x')*210 就相当于将210毫米长转化到打印机的横向点数。
function GetMM_Rate_Pixel(XorY :Char) :Double;
var
PMM :Tpoint;
PPixel :TPoint;
begin
Pmm.x := GetDeviceCaps(printer.handle,HORZSIZE);
Pmm.y := GetDeviceCaps(Printer.handle,VERTSIZE);
PPixel.x := GetDeviceCaps(Printer.Handle,HORZRES);
PPixel.y := GetDeviceCaps(Printer.Handle,VERTRES);
if Upcase(Xory) = 'X' then
result := ppixel.x/PMM.x else
result := PPixel.y/pmm.y;
end;

function GetPrinterRes(const pobj: TPrinter;
Horz: Boolean):do
uble;
var
Index: Integer;
begin
if Horz then
Index:=LOGPIXELSX
else
Index:=LOGPIXELSY;
Result:=GetDeviceCaps(pobj.Handle, Index);
end;

//******************* ConvertMMtoPixelsY *************************
//转化纸张实际宽度(MM)到打印的点数。
//比如 ConvertMMtoPixelsY(40) 代将40毫米宽的纸张大小转化成打印机的画布大小。
function ConvertMMtoPixelsX(const Value:Double):Integer;
begin
Result := Round(Value*GetMM_Rate_Pixel('x'));
end;
//******************* ConvertMMtoPixelsY *************************
//转化纸张实际高度(MM)到打印的点数。
//比如 ConvertMMtoPixelsY(40) 代将40毫米高的纸张大小转化成打印机的画布大小。
function ConvertMMtoPixelsY(const Value:Double):Integer;
begin
Result :=Round(Value*GetMM_Rate_Pixel('y'));
end;

function ConvertInchtoPixelsX(const Value:Double):Integer;
begin
Result := Round(Value*GetPrinterRes(Printer, True));
end;
//******************* ConvertInchtoPixelsX *************************
//转化纸张实际高度(英寸)到打印的点数。
//比如 ConvertMMtoPixelsY(40) 代将40英寸的纸张大小转化成打印机的画布大小。
function ConvertInchtoPixelsY(const Value:Double):Integer;
begin
Result := Round(Value*GetPrinterRes(Printer, False));
end;
[:D]
 
后退
顶部