TN030:自定义打印和打印预览
备注
以下技术声明,则它在联机文档,首先包括了不更新。因此,某些过程和主题可能已过时或不正确。有关最新信息,建议您搜索议题在联机文档的索引。
此说明描述了自定义打印和打印预览处理并描述了用于 CView 的回调实例和回调实例的用途以及 CPreviewView的成员函数。
问题
MFC 提供大多数打印提供完整的解决方案,并打印预览需要。 在大多数情况下,附加代码需要一个点可以具有的视图和打印预览。 但是,在需要大量成败开发人员在节的方法来优化打印,因此,某些应用程序需要添加特定用户界面元素、打印预览模式。
有效的打印
使用标准方法时, MFC 应用程序打印,窗口处理所有图形设备 (GDI)接口输出对内存图元文件。 当 EndPage 调用时,窗口一次播放图元文件需要打印机打印一页的每个物理带区的。 在呈现过程, GDI 频繁查询中止程序以确定是否应继续。 通常中止程序允许消息处理打印对话框,,以便用户能中止打印作业。
遗憾的是,这会降低晒印方法。 如果在应用程序中打印必须快速使用标准技术,还可以实现,则必须实现手动分级。
打印分级
以手动带区,必须有关实现打印循环这样 OnPrint 调用每页的多次 (一次带区)。 打印循环在 viewprnt.cpp 的 OnFilePrint 功能由实现。 在您的 CView派生类,则重载此功能,以便处理的打印排列消息映射项调用您的打印功能。 复制 OnFilePrint 实例并更改打印循环来实现分级。 您可能还需要通过条带矩形到您的打印功能,以便您可以优化基于打印的页的部分的绘图。
接下来,必须频繁调用 QueryAbort ,在绘制带区时。 否则,中止程序不会调用,并且用户无法取消打印作业。
打印预览:与用户界面的电子文件
打印预览,实质上,将显示更改的尝试打印机的仿真。 默认情况下,主窗口的工作区用于完全显示页。在窗口中。 用户可以在页上的区域更详细地发现它。 附加支持,用户甚至可能允许编辑文档中预览模式。
自定义打印预览
此说明只处理修改的打印预览的一个方面:添加 UI 到预览模式。 其他修改是可能的,但是,此类更改超出了本文的讨论范围。
添加 UI 到预览模式
从派生 CPreviewView视图类。
添加所需的 UI 方面的命令处理程序。
如果添加可视方面是为显示,请重写 OnDraw 并在调用 **CPreviewView::OnDraw.**之后执行您的绘图
OnFilePrintPreview
这是打印预览的命令处理程序。 其默认实现为:
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize,
// delete State now
}
}
DoPrintPreview 将隐藏应用程序的主窗格中。 控制条,例如状态栏,可以通过指定它们只在 pState->dwStates 成员 (这是位掩码,并独立控件条的位由 AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR) 定义的。 windows pState->nIDMainPane 是将自动隐藏和 reshown 的窗口。 DoPrintPreview 然后将创建标准预览的 UI 的一个按钮条。 如果特定窗口操作是必需的,如隐藏或显示其他窗口,应执行,在 DoPrintPreview 调用之前。
默认情况下,那么,当打印预览完成时,它返回控制条到其原始状态和主窗格将显示。 如果特殊处理是必需的,它在 **EndPrintPreview.**重写应对如果 DoPrintPreview 失败,也提供特殊处理。
DoPrintPreview 调用与:
对话框模板的资源 ID 预览工具栏上的。
用于执行打印预览的打印视图的指针。
预览视图类的运行时类。 这在 DoPrintPreview 将动态创建。
CPrintPreviewState 指针。 监视帧未能创建 CPrintPreviewState 结构 (或派生的结构,如果应用程序需要保留的更多状态)。 DoPrintPreview 是无模式,并且此结构必须存在,直到 EndPrintPreview 调用。
备注
如果单独视图或视图类对打印需要的支持,指向该对象应将作为第二个参数。
EndPrintPreview
这称为停止打印预览模式。 移动到最后一个打印预览中显示文档的页通常适用。 EndPrintPreview 是应用程序的机会执行此操作。 pInfo->m_nCurPage 成员是最后显示的页 (最左侧,如果两个页中显示出来),并且,指针是页的用户感兴趣的提示关于。 因为应用程序视图的结构未知到框架,则必须提供代码移到选择的点。
您应在调用 CView::EndPrintPreview之前执行大多数操作。 此调用反转 DoPrintPreview 的效果并删除 pView、 pDC 和 pInfo。
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);
CWinApp::OnFilePrintSetup
必须对打印设置菜单项映射到。 在大多数情况下,重写实现并不是必需的。
页名为原则
另一议题是页数字和顺序。 对于简单的字处理应用程序键入应用程序,这是直接的问题。 大多数打印预览系统认为,每个打印的页对应于文档的一页。
在尝试提供一个通用的解决方案,需要考虑几个问题。 假设一个计算机辅助设计系统。 用户还包含若干 E 大小页的一个绘图。 在 E 大小 (或更小,调用) 绘图员,页编号在简单的情况。 但是,在激光打印机,打印每个页 16 大小页,打印预览视为哪些 “页”?
用作表示段状态,打印预览操作与打印机。 因此,用户看到从中选择的特定打印机出现。 将由确定的视图图像在打印每一页。
在 CPrintInfo 结构的页声明字符串提供显示页码方法向用户,则可以表示为每页的数字 (在 “页 1 " 或 “页 1-2”)。 此字符串由 CPreviewView::OnDisplayPageNumber的默认实现。 如果一个不同的显示是必需的,一个可重写此虚函数提供,例如, “Sheet1,部分 A, B”。