多页文档
本文介绍包含多个打印的页协议的窗口并演示如何打印文档。 这篇文章包含以下主题:
打印协议
重写的视图类函数
分页
打印机页。文档页
打印时分页
打印协议
打印多页按以下方式文档,即选择该表的结构和的视图。 首先框架显示 打印 对话框中,创建打印机的设备上下文,并调用 CDC 对象的 StartDoc 成员函数。 然后,文档的每页,框架要求 CDC 对象的 为 StartPage 成员函数,指示视图对象打印页,并调用 EndPage 成员函数。 如果必须在开始特定页之前更改打印机模式中,视图调用 ResetDC,更新包含新打印机架构信息的 DEVMODE 结构。 在整个文档中打印后,框架调用 EndDoc 成员函数。
重写的视图类函数
CView 类定义在打印期间,由框架调用的几个成员函数。 通过在您的视图类的这些功能,则提供结构的打印逻辑和您的视图类的打印逻辑之间建立连接。 下表列出了这些成员函数。
打印的 CView 的可重写的函数
名称 |
重写的原因 |
---|---|
对打印对话框的插入值,文档的尤其是长度 |
|
分配字体或其他 GDI 资源 |
|
为特定页调整设备上下文的属性,或执行打印时分页 |
|
打印特定页 |
|
释放 GDI 资源 |
可以执行与打印相关处理在其他功能,但是,这些功能是驱动晒印方法的脚本。
下图演示中涉及的步骤晒印方法和每个 entity_CODECView 的版式成员函数调用的显示。 本文的其余部分将更详细地说明大多数这些步骤。 的其他部分。这篇文章 分配 GDI 资源晒印方法进行了介绍。
打印循环
分页
框架在 CPrintInfo 结构存储许多有关打印作业的信息。 是在 CPrintInfo 的值与分页;这些值是可访问的如下表所示。
在 CPrintInfo 存储的分页信息
变量成员或 函数名 |
引用的分页 |
---|---|
GetMinPage/SetMinPage |
第一页文档 |
GetMaxPage/SetMaxPage |
之前页文档 |
GetFromPage |
要打印的第一页 |
GetToPage |
要打印的页。 |
m_nCurPage |
当前打印的页 |
分页 1 开始,也就是说,第一页数字 1,不是 0。 有关这些属性和 CPrintInfo的更多信息其他成员,请参见 MFC 引用。
在本晒印方法,框架调用视图的 OnPreparePrinting 成员函数,并指向 CPrintInfo 结构。 应用程序向导提供调用 DoPreparePrintingOnPreparePrinting 的实现, CView的另一个成员函数。 DoPreparePrinting 是显示打印对话框并创建打印机上下文的功能。
此时应用程序不知道多少页在文档。 为数量的第一个元素和文档的第一页使用默认 1 和 0xFFFF。 如果您知道数的页文档具有,请重写 OnPreparePrinting 并调用 CPrintInfo 结构的 SetMaxPage ,然后将其发送到 DoPreparePrinting之前。 这使您可以指定长度的文档。
DoPreparePrinting 然后显示打印对话框。 当返回时, CPrintInfo 结构包含用户指定的值。 如果用户要打印页的一个选定的范围,他或她在打印对话框可以指定用于启动和端页编号。 使用 CPrintInfo,的 GetFromPage 和 GetToPage 功能框架检索这些值。 如果用户未指定区域设置,框架调用 GetMinPage 和 GetMaxPage 并使用返回的值打印整个文档。
为要打印的文档的每页,框架调用在您的视图类、 OnPrepareDC 和 OnPrint的两个成员函数,并将每个功能两个参数:对一 CDC 对象的指针和指向 CPrintInfo 结构。 每次框架调用 OnPrepareDC 和 OnPrint,通过在 CPrintInfo 结构的 m_nCurPage 成员的值不同。 这种框架调用视图应该打印哪一页。
OnPrepareDC 成员函数用于屏幕显示还使用。 ,在绘制前,它进行调整到设备上下文。 OnPrepareDC 服务在打印的类似的效果,,但有两个差异:首先, CDC 对象表示打印机上下文 (而不是屏幕设备上下文,并且,接下来, CPrintInfo 对象作为第二个参数。 (此参数是 NULL ,当 OnPrepareDC 为一个屏幕显示了调用。)重写 OnPrepareDC 进行调整。具体取决于页的设备上下文中打印。 例如,可以滚动视区原点与该剪辑区域确保文档的相应部分印出。
OnPrint 成员函数执行的页实际打印。 这篇文章 默认打印如何完成 演示框架如何调用 OnDraw 的打印机上下文执行打印。 更确切地说,框架调用与 CPrintInfo 结构和设备上下文的 OnPrint 和 OnPrint 通过设备上下文到 OnDraw。 重写 OnPrint 执行任何应仅完成在打印期间不适用于屏幕显示的呈现。 例如,打印页眉或页脚 (参见中的文章 页眉和页脚 有关更多信息)。 然后调用从 OnPrint 重写的 OnDraw 进行呈现的常见到屏幕上显示和打印。
该条件 OnDraw 进行呈现屏幕显示和打印意味着您的应用程序是 WYSIWYG:“所见即所得可得到”。但是,假设您不编写 WYSIWYG 应用程序。 例如,请考虑使用用粗体以打印,但显示控件代码可以指示在屏幕的加粗文本的文本编辑器。 在这种情况下,为屏幕显示强使用 OnDraw 。 当您重写 OnPrint时,请替换对的调用的 OnDraw 到单独的绘制功能。 功能绘制文档时所采用的方式显示它在本质,使用在屏幕不显示的属性。
打印机页。文档页
当引用分页时,区分页打印机的概念和页之间的文件的概念有时需要的。 从打印机的角度来看,页是一个平板纸。 但是,一个平板纸不一定等于文档的一页。 例如,因此,如果打印简讯,将折叠页,一个平板纸可能包含文档的两第一个和最后一页,并行。 同样,因此,如果打印一个电子表格,文档根本不包括页。 相反,一个平板纸可能包含行 1 到 20, 6 至 10 列。
在 CPrintInfo 结构中的所有分页引用打印机页。 框架调用 OnPrepareDC 和 OnPrint 将通过打印机的每个平板纸的。 当您重写 OnPreparePrinting 功能指定文档时的长度,必须使用打印机页。 如果有对应的关系 (即一打印机页等于文档页),则非常容易。 如果为,则另一方面,文档页,并且打印机页不直接对应,必须将它们之间。 例如,请考虑打印电子表格。 当重写 OnPreparePrinting时,必须计算需要多少个平板纸打印整个电子表格然后使用该值,在调用 CPrintInfo时的 SetMaxPage 成员函数。 同样,,并重写的 OnPrepareDC,必须将 m_nCurPage 为将显示在该特定页相应地然后调整视区原点行和列的大小。
打印时分页
在某些情况下,您的视图类可能无法提前知道文档处于,直到实际打印的。 例如,假定您的应用程序不是 WYSIWYG,因此,在屏幕的一个文件的长度不对应于其长度,在打印。
,当您重写您的视图类时, OnPreparePrinting 这会导致一个问题:,因为您不知道文档,的长度不能通过值传递到 CPrintInfo 结构的 SetMaxPage 功能。 如果用户未指定分页停止在使用打印对话框,框架时不知道停止打印循环。 ,在结束时,唯一的方式确定终止打印循环何时将输出文档和发现。 您的视图类必须检查文档末尾,以便在打印,则通知框架中,当末尾时。
框架时取决于视图类的 OnPrepareDC 功能以停止。 在每个调用 OnPrepareDC后,框架检查调用 m_bContinuePrinting的 CPrintInfo 结构的成员。 其默认值为 **TRUE.**只要这使,框架继续打印循环。 如果它设置为 FALSE,框架停止。 执行打印时分页、重写 OnPrepareDC 检查文档末尾是否已到达和设置的 m_bContinuePrinting 到 FALSE ,在具有。
,如果当前页比 1. 越大, OnPrepareDC 的默认实现 m_bContinuePrinting 设置为 FALSE 。 这意味着,如果文档的长度未指定,则框架假定文档中早已一页。 这样的一个结果是必须小心,如果调用 OnPrepareDC的基类版本。 不要假定, m_bContinuePrinting 将是 TRUE 在调用基类版本。