如何以厘米为单位打印?(50分)

  • 主题发起人 主题发起人 hfade
  • 开始时间 开始时间
H

hfade

Unregistered / Unconfirmed
GUEST, unregistred user!
如何以厘米为单位打印?
 
用reportbuilder 可以选择单位 :cm,inch,pixel.
它里面的相关控件的单位即为此单位。
 
我要用Tprinter
是不是可以用GetDeviceCaps 之类的API来
得到每厘米多少像素
 
很容易,
Windows API:SetMapMode设置Device Context的映射
模式,要以厘米为单位打印,将映射模式设置为
1、MM_LoMetric
低精度米制单位,每单位为0.1毫米
2、MM_HiMetric
高精度米制单位,每单位为0.01毫米

这两中映射模式中X轴向右,Y轴向上,与普通模式不同,
要注意。

以下代码画一个直径1cm的圆:
with Printerdo

begin

begin
Doc;
try
OldMapMode:=SetMapMode(Canvas.Handle,MM_LoMetric);
Canvas.Ellipse(1000,-300,1100,-400);
SetMapMode(Canvas.Handle,OldMapMode);
finally
EndDoc;
end;

end;


另有SetWindowOrgEx函数设置原点坐标

怎么样,满意了吧?
 
无论你如何操作Canvas你都要用到它的座标系,将座标系放缩一下即可.
以下方案以0.1mm为单位而不是cm

1.取缩放比例:

function LogRateX: Integer;
begin

Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX) * 1000 div 254;
end;


function LogRateY: Integer;
begin

Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY) * 1000 div 254;
end;


加1000的倍率是为了保证精度而避免浮点运算,引用时须除1000

2.建立座标换算函数:

function PixelX(X: Integer): Integer;
begin

Result := X * LogRateX div 1000;
end;


function PixelY(Y: Integer): Integer;
begin

Result := Y * LogRateY div 1000;
end;


function PixelPoint(OldPoint: TPoint): TPoint;
begin

Result := Point(PixelX(OldPoint.X),PixelY(OldPoint.Y));
end;


3.使用注意:为避免频繁调用API函数,最好将LogRateX和LogRateY
保存起来,重置打印机时则重新计算;
 
李颖的方法虽说也可用,但免不了有时需要用像素为单位.
 
barton的方法 比较符合常规,
但李颖的方法也很有价值。
多谢大家!!!
 
多人接受答案了。
 
后退
顶部