Windows下打印学习笔记

在Windows下对打印的处理和对屏幕的处理是一致的,都使用了在逻辑设备上绘制,然后映射到物理设备上,从而最大程度保证了代码与设备的关联最小。 很明显,要实现打印,必须清楚两点: 1) 设备(打印机)能够支持多大的打印尺寸 2) 打印尺寸和逻辑尺寸的映射关系 例如打印机的打印尺寸为200mm X 200mm,映射关系为1mm=1逻辑单位,那么在逻辑设备上绘制以(100,100)为圆心,100为半径的圆,将最大限度地充满整个逻辑设备,打印出来也就将以(100mm,100mm) 为圆心,100mm为半径,也即最大限度地充满整张打印纸。 对上面两点,Windows提供了这样的API: 1) GetDeviceCaps,提供不同参数来获得设备(这里是打印机)的各种尺寸 2) SetMapMode,设置映射关系 下面结合Delphi来说明API的使用―― 例如GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH)将得到打印机的宽度(以 点为单位),GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX)将得到打印机每英寸的打印点数。上述两个值相除就可以得到打印机的宽度(以英寸为单位)。 下列代码 SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC) ; VertSize:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 2.54 * 10 * 10; HorzSize:= GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 2.54 * 10 * 10; 将逻辑坐标的最大宽度计算得到后放在HorzSize中,逻辑坐标的最大长度放在VertSize中。任何超出这个范围的绘制操作都无法最终打印出来。仔细的注释如下: GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) 得到宽度(以英寸为单位),SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC)决定了从逻辑单位到物理单位的关系为:1逻辑单位=0.1mm(即1mm=10逻辑单位),而1英寸=2.54cm。所以应该将宽度乘以2.54得到以厘米为单位的宽度,再乘以10转换为以毫米为单位,最后再乘以10转换为基于逻辑单位的宽度。 另外在MM_LOMETRIC映射下,逻辑页左上角为(0,0),x轴水平向右,y轴垂直向上,依次在逻辑坐标中,可以绘制(能够体现在打印页上)的范围为(0,0)-(HorzSize,-VertSize)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值