精确打印Image画布
发布时间 2023-08-16 17:12:33作者: lucken
最初的原则不变,那么从效果上来说还是一样,还是需要放大的过程。打开VCL,我们发现 Printer单元封装了大量的有关打印机操作的API函数(这句是废话..), 我们在需要获得打印机画布信息时,可以很方便的直接调用属性。
首先,需要一个放大比例:
lMultiple:= Min(Printer.PageWidth div Image.Width,
(Printer.PageHeight div Image.Height);
为了居中显示,还需要长宽各方向的偏差:
lLeft:= (Printer.PageWidth - Image.Width * lMultiple) div 2;
lTop := (Printer.PageHeight - Image.Height* lMultiple) div 2;
先来讲一下线段、矩形框之类的图形输出,这一类比较简单,只要定位好坐标就可以。
以线段为例:
Pen.Width:=PenSize*lMultiple; // 线宽放大
Pen.Style:= psSolid;
MoveTo(PointA.X*lMultiple+lLeft, PointA.Y*lMultiple+lTop);
LineTo(PointB.X*lMultiple+lLeft, PointB.Y*lMultiple+lTop);
遇到文字信息时,首先,其坐标设置与线段相同,不过在字体大小设置时,为了像原画布上那样,与线段、矩形框这些元素保持相对位置不变,势必不能使用原始大小。但是像线宽那样Font.Size:= FontSize * lMultiple; 的话,打印出来的就是大字报了。那么该如何设置呢?
这里,我们需要迂回一下,先设置Printer.Canvas.Font.Height 属性,方法是:
Image.Canvas.Font.Size:= TextSize ; // 原始字体尺寸
Image.Canvas.Font.Name:= Trim(StrPas(@.TextStyle)); // 原始字体样式
Font.Height:= Image.Canvas.TextHeight('|')* lcMultiple; // 比例放大Height属性
Font.Size:= Round( - Font.Height * 72 / Font.PixelsPerInch);
// 这里的 Font.PixelsPerInch 等效于
// GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) // 打印机Y方向分辨率
(如果涉及到多行打印,自动换行问题,需要用到 DrawText 函数,一些设置问题尚在测试中,完成了再拿出来与大家分享)
如此这般,就可以比较精确的实现单行文本输出了,在Delphi6上测试通过。