本文共 972 字,大约阅读时间需要 3 分钟。
MFC框架提供了一个高效的打印与打印预览功能,其核心原理是通过CView类的OnDraw方法统一处理显示和打印操作。当用户进行打印时,设备上下文DC会根据用户操作选择目标设备(屏幕或打印机),并通过不同的设备映射方式处理输出。
在打印预览模式下,传入的DC看似与屏幕设备一致,但实际上是根据系统默认打印机设置构造的。以常见的A4纸张(210mm×297mm)和1200dpi分辨率为例,当调用GetDeviceCaps(HORZSIZE)和GetDeviceCaps(VERTSIZE)时,会返回210和297毫米的值,这正是A4纸的实际尺寸。然而,使用GetDeviceCaps(HORZRES)和GetDeviceCaps(VERTRES)时,会返回9917和14031,这是基于1200dpi分辨率计算出的屏幕象素数量。
值得注意的是,当使用MemDC创建与pDC兼容的内存DC时,获取的设备属性值与pDC存在显著差异。内存DC通常返回固定值(如320和240),而不是与打印机设置一致的数值。此外,尽管设置相同的MM_LOMETRIC映射模式,MemDC的映射方式与pDC仍存在差异,导致坐标转换结果不一致。通过分析发现,这是由于DC的“视口”和“窗口”概念不同所致。视口基于实际输出设备的度量单位,而窗口则基于逻辑坐标系。DPtoLP和LPtoDP运算仅在映射模式和度量单位一致时才能保证一致性。
在VC++6.0中使用AppWizard生成的MFC程序在默认设置下,打印输出的图像会显著缩小。这是由于MFC采用默认的MM_TEXT映射模式,导致屏幕和打印设备的坐标比例不一致。例如,屏幕的96象素/英寸与打印机的600点数存在差异。为了解决这一问题,可以通过重载OnPrepareDC方法并修改映射模式为MM_ANISOTROPIC,实现坐标比例的自定义设置。
具体实现步骤如下:
通过上述方法,仅需几行代码即可实现屏幕与打印输出一致的效果。这不仅简化了实现过程,也显著提升了打印质量。
转载地址:http://dwffk.baihongyu.com/