多页文档

本文介绍包含多个打印的页协议的窗口并演示如何打印文档。 这篇文章包含以下主题:

  • 打印协议

  • 重写的视图类函数

  • 分页

  • 打印机页。文档页

  • 打印时分页

打印协议

打印多页按以下方式文档,即选择该表的结构和的视图。 首先框架显示 打印 对话框中,创建打印机的设备上下文,并调用 CDC 对象的 StartDoc 成员函数。 然后,文档的每页,框架要求 CDC 对象的 为 StartPage 成员函数,指示视图对象打印页,并调用 EndPage 成员函数。 如果必须在开始特定页之前更改打印机模式中,视图调用 ResetDC,更新包含新打印机架构信息的 DEVMODE 结构。 在整个文档中打印后,框架调用 EndDoc 成员函数。

重写的视图类函数

CView 类定义在打印期间,由框架调用的几个成员函数。 通过在您的视图类的这些功能,则提供结构的打印逻辑和您的视图类的打印逻辑之间建立连接。 下表列出了这些成员函数。

打印的 CView 的可重写的函数

名称

重写的原因

OnPreparePrinting

对打印对话框的插入值,文档的尤其是长度

OnBeginPrinting

分配字体或其他 GDI 资源

OnPrepareDC

为特定页调整设备上下文的属性,或执行打印时分页

OnPrint

打印特定页

OnEndPrinting

释放 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,的 GetFromPageGetToPage 功能框架检索这些值。 如果用户未指定区域设置,框架调用 GetMinPageGetMaxPage 并使用返回的值打印整个文档。

为要打印的文档的每页,框架调用在您的视图类、 OnPrepareDCOnPrint的两个成员函数,并将每个功能两个参数:对一 CDC 对象的指针和指向 CPrintInfo 结构。 每次框架调用 OnPrepareDCOnPrint,通过在 CPrintInfo 结构的 m_nCurPage 成员的值不同。 这种框架调用视图应该打印哪一页。

OnPrepareDC 成员函数用于屏幕显示还使用。 ,在绘制前,它进行调整到设备上下文。 OnPrepareDC 服务在打印的类似的效果,,但有两个差异:首先, CDC 对象表示打印机上下文 (而不是屏幕设备上下文,并且,接下来, CPrintInfo 对象作为第二个参数。 (此参数是 NULL ,当 OnPrepareDC 为一个屏幕显示了调用。)重写 OnPrepareDC 进行调整。具体取决于页的设备上下文中打印。 例如,可以滚动视区原点与该剪辑区域确保文档的相应部分印出。

OnPrint 成员函数执行的页实际打印。 这篇文章 默认打印如何完成 演示框架如何调用 OnDraw 的打印机上下文执行打印。 更确切地说,框架调用与 CPrintInfo 结构和设备上下文的 OnPrintOnPrint 通过设备上下文到 OnDraw。 重写 OnPrint 执行任何应仅完成在打印期间不适用于屏幕显示的呈现。 例如,打印页眉或页脚 (参见中的文章 页眉和页脚 有关更多信息)。 然后调用从 OnPrint 重写的 OnDraw 进行呈现的常见到屏幕上显示和打印。

该条件 OnDraw 进行呈现屏幕显示和打印意味着您的应用程序是 WYSIWYG:“所见即所得可得到”。但是,假设您不编写 WYSIWYG 应用程序。 例如,请考虑使用用粗体以打印,但显示控件代码可以指示在屏幕的加粗文本的文本编辑器。 在这种情况下,为屏幕显示强使用 OnDraw 。 当您重写 OnPrint时,请替换对的调用的 OnDraw 到单独的绘制功能。 功能绘制文档时所采用的方式显示它在本质,使用在屏幕不显示的属性。

打印机页。文档页

当引用分页时,区分页打印机的概念和页之间的文件的概念有时需要的。 从打印机的角度来看,页是一个平板纸。 但是,一个平板纸不一定等于文档的一页。 例如,因此,如果打印简讯,将折叠页,一个平板纸可能包含文档的两第一个和最后一页,并行。 同样,因此,如果打印一个电子表格,文档根本不包括页。 相反,一个平板纸可能包含行 1 到 20, 6 至 10 列。

CPrintInfo 结构中的所有分页引用打印机页。 框架调用 OnPrepareDCOnPrint 将通过打印机的每个平板纸的。 当您重写 OnPreparePrinting 功能指定文档时的长度,必须使用打印机页。 如果有对应的关系 (即一打印机页等于文档页),则非常容易。 如果为,则另一方面,文档页,并且打印机页不直接对应,必须将它们之间。 例如,请考虑打印电子表格。 当重写 OnPreparePrinting时,必须计算需要多少个平板纸打印整个电子表格然后使用该值,在调用 CPrintInfo时的 SetMaxPage 成员函数。 同样,,并重写的 OnPrepareDC,必须将 m_nCurPage 为将显示在该特定页相应地然后调整视区原点行和列的大小。

打印时分页

在某些情况下,您的视图类可能无法提前知道文档处于,直到实际打印的。 例如,假定您的应用程序不是 WYSIWYG,因此,在屏幕的一个文件的长度不对应于其长度,在打印。

,当您重写您的视图类时, OnPreparePrinting 这会导致一个问题:,因为您不知道文档,的长度不能通过值传递到 CPrintInfo 结构的 SetMaxPage 功能。 如果用户未指定分页停止在使用打印对话框,框架时不知道停止打印循环。 ,在结束时,唯一的方式确定终止打印循环何时将输出文档和发现。 您的视图类必须检查文档末尾,以便在打印,则通知框架中,当末尾时。

框架时取决于视图类的 OnPrepareDC 功能以停止。 在每个调用 OnPrepareDC后,框架检查调用 m_bContinuePrintingCPrintInfo 结构的成员。 其默认值为 **TRUE.**只要这使,框架继续打印循环。 如果它设置为 FALSE,框架停止。 执行打印时分页、重写 OnPrepareDC 检查文档末尾是否已到达和设置的 m_bContinuePrintingFALSE ,在具有。

,如果当前页比 1. 越大, OnPrepareDC 的默认实现 m_bContinuePrinting 设置为 FALSE 。 这意味着,如果文档的长度未指定,则框架假定文档中早已一页。 这样的一个结果是必须小心,如果调用 OnPrepareDC的基类版本。 不要假定, m_bContinuePrinting 将是 TRUE 在调用基类版本。

w7wzay73.collapse_all(zh-cn,VS.110).gif您想进一步了解什么?

请参见

参考

打印

CView 类

CDC 类