Delphi中票据条码的打印中(像素)和厘米的换算关系

function GetPixelsPerInchX: Integer;
begin
Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX)
end;
function GetPixelsPerInchY: Integer;
begin
Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
end;
1厘米=100*GetPixelsPerInchY/25.4 像素 打印机的Y方向。
1厘米=100*GetPixelsPerInchX/25.4 像素 打印机的X方向。

-------------------------------------------------------------------------------------------------------------------------------------

给个我刚写的代码,打印机上调试通过,可以精确定位到毫米。
用offsetX,offsetY调整打印偏移量,单位为毫米。
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
if PrinterSetupDialog1.Execute then
begin
prtX:=GetDeviceCaps(printer.Handle,LOGPIXELSX);
memo1.Lines.Add('打印机水平分辨率LOGPIXELSX='+inttostr(prtX));
prtY:=GetDeviceCaps(printer.Handle,LOGPIXELSY);
memo1.Lines.Add('打印机垂直分辨率LOGPIXELSY='+inttostr(prtY));
paperW:=GetDeviceCaps(printer.Handle,PHYSICALWIDTH);
memo1.Lines.Add('打印纸的实际宽度PHYSICALWIDTH='+inttostr(paperW)+' ('+inttostr(round(paperW/prtX))+')inch');
paperH:=GetDeviceCaps(printer.Handle,PHYSICALHEIGHT);
memo1.Lines.Add('打印纸的实际高度PHYSICALHEIGHT='+inttostr(paperH)+' ('+inttostr(round(paperH/prtY))+')inch');
prtLeft:=GetDeviceCaps(printer.Handle,PHYSICALOFFSETX);
memo1.Lines.Add('实际可打印区域的物理左边距PHYSICALOFFSETX='+inttostr(prtLeft));
prtTop:=GetDeviceCaps(printer.Handle,PHYSICALOFFSETY);
memo1.Lines.Add('实际可打印区域的物理上边距PHYSICALOFFSETY='+inttostr(prtTop));
memo1.Lines.Add('Printer.PageWidth='+inttostr(Printer.PageWidth));
memo1.Lines.Add('Printer.PageHeight='+inttostr(Printer.PageHeight));
end;
inifile:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
OX:=inifile.ReadInteger('print','offsetX',0);
OY:=inifile.ReadInteger('print','offsetY',0);
memo1.Lines.Add('offsetX='+inttostr(OX));
memo1.Lines.Add('offsetY='+inttostr(OY));
end;

 

-------------------------------------------------------------------------------------------------------------------------------------

//毫米单位转换为英寸单位
function MmToInch(Length: Extended): Extended;
begin
Result := Length/25.4;
end;
//英寸单位转换为毫米单位
function InchToMm(Length: Extended): Extended;
begin
Result := Length*25.4;
end;

=============
with Printerdo
begin
Canvas.Font.Size:=12;
wordHeight:=Canvas.TextHeight('字');
wordWidth:=Canvas.TextWidth('字');
begin
DOC;
With Canvasdo
begin
x:=20+OX;
y:=30+OY;
s:='这行文本将打印在20,30mm处';
TextOut(round(prtX*MmToInch(x)),round(prtX*MmToInch),s);
end;
EndDoc;
end;

-------------------------------------------------------------------------------------------------------------------------------------

像素值如何转换为毫米值

水平方向:
mm:= Pixel / GetDeviceCaps(Canvas.Handle, LOGPIXELSX) * 25.4;
垂直方向:
mm:= Pixel / GetDeviceCaps(Canvas.Handle, LOGPIXELSY) * 25.4;
厘米数 = 像素数 / dpi * 2.54,
像素转化厘米对于显示器没意义,只有对打印机这类的输出设备才有意义。
600 dpi的打印机和1200dpi的打印机都打印一个1000像素的直线他们长度是不同的。
如果我想要把屏幕上点与点的距离转为厘米有什么好的方法呢!
回复人: ttxm(耳朵) ( ) 信誉:100 2002-12-27 18:03:00 得分:0
没有特别好的办法,思路同pazee(耙子)说的一样?
代码如下(是毫米):
function getmmScreen:TPoint;
var
p1:TPoint;
begin
p1.X:=GetDeviceCaps(frmSize.Canvas.Handle,HORZSIZE);
p1.Y:=GetDeviceCaps(frmSize.Canvas.Handle,VERTSIZE);
Result:=p1;
end;funCtion getPixelScreen:TPoint;
var
p1:TPoint;
begin
p1.X:=screen.Width;
p1.Y:=screen.Height;
result:=p1;
end;
procedure TfrmSize.mmToPix;
begin
mmTopixX:=getPixelScreen.X / getMMScreen.X
mmTopixY:=getPixelScreen.Y / getMMScreen.Y
end;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值