本文介绍了 MFC 框架如何实现打印预览功能。 涵盖的主题包括:
打印预览与屏幕显示和打印有些不同,因为应用程序必须使用屏幕模拟打印机,而不是直接在设备上绘制图像。 为了适应这一点,Microsoft基础类库定义了一个从 CDC 类派生的特殊(未记录)类,称为 CPreviewDC
。 所有 CDC
对象都包含两个设备上下文,但通常是相同的。 在对象中,它们不同:第一个 CPreviewDC
表示要模拟的打印机,第二个表示实际显示输出的屏幕。
打印预览过程
当用户从 “文件” 菜单中选择“打印预览”命令时,框架将创建一个 CPreviewDC
对象。 每当应用程序执行设置打印机设备上下文特征的作时,框架也会在屏幕设备上下文上执行类似的作。 例如,如果应用程序选择用于打印的字体,框架会为模拟打印机字体的屏幕显示选择字体。 每当应用程序将输出发送到打印机时,框架就会将输出发送到屏幕。
打印预览也不同于打印的顺序,每个打印都绘制文档的页面。 在打印期间,框架将继续执行打印循环,直到呈现特定的页面范围。 在打印预览期间,随时显示一两页,然后应用程序等待;在用户响应之前,不会显示其他页面。 在打印预览期间,应用程序还必须响应WM_PAINT消息,就像在普通屏幕显示期间一样。
调用预览模式时调用 CView::OnPreparePrinting 函数,就像在打印作业开始时一样。 传递给函数的 CPrintInfo 结构 结构包含多个成员,这些成员的值可以设置为调整打印预览作的某些特征。 例如,可以设置 m_nNumPreviewPages 成员以指定是要在单页模式还是双页模式下预览文档。
修改打印预览
可以通过多种方式修改打印预览的行为和外观。 例如,可以除其他事项外:
导致打印预览窗口显示滚动条,以便轻松访问文档的任何页面。
使打印预览通过在当前页上开始显示来维护用户在文档中的位置。
导致对打印预览和打印执行不同的初始化。
导致打印预览以自己的格式显示页码。
如果知道文档的时长和使用适当的值进行调用 SetMaxPage
,框架可以在预览模式下以及在打印期间使用此信息。 框架知道文档的长度后,它可以为预览窗口提供滚动条,允许用户在预览模式下来回翻页浏览文档。 如果尚未设置文档的长度,框架无法定位滚动框以指示当前位置,因此框架不会添加滚动条。 在这种情况下,用户必须使用预览窗口控件栏上的“下一页”和“上一页”按钮来逐页浏览文档。
对于打印预览,你可能会发现,将值分配给 m_nCurPage 成员 CPrintInfo
非常有用,即使你永远不会对普通打印执行此作。 在普通打印过程中,此成员会将框架中的信息传送到视图类。 这是框架如何告知视图应打印哪个页面。
相比之下,当启动打印预览模式时, m_nCurPage 成员将按相反的方向传递信息:从视图到框架。 框架使用此成员的值来确定应首先预览哪个页面。 此成员的默认值为 1,因此文档的第一页最初显示。 可以重写 OnPreparePrinting
将此成员设置为调用打印预览命令时正在查看的页面数。 这样,应用程序在从普通显示模式移动到打印预览模式时会保持用户的当前位置。
有时,可能需要 OnPreparePrinting
执行不同的初始化,具体取决于是针对打印作业调用还是用于打印预览。 可以通过检查结构中的CPrintInfo
m_bPreview成员变量来确定这一点。 调用打印预览时,此成员设置为 TRUE 。
该 CPrintInfo
结构还包含一个名为 m_strPageDesc的成员,该成员用于设置以单页模式和多页模式在屏幕底部显示的字符串的格式。 默认情况下,这些字符串的格式为“Page n”和“Pages n - m”,但你可以从内部OnPreparePrinting
修改m_strPageDesc,并将字符串设置为更详细的内容。 有关详细信息,请参阅 MFC 参考中的 CPrintInfo 结构。