Windows下打印学习笔记

来源:互联网 发布:英语听力软件免费 编辑:程序博客网 时间:2024/06/10 22:25
在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)。
原创粉丝点击