按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
以for 循环针对文件中的每一页开始做打印动作。
调用CView::OnPrepareDC。此函数什么也没做。如果你要在每页前面加表头,就请
改写这个虚拟函数。
修改【打印状态】对话框中的页次。
StartPage 开始新的一页。
680
…………………………………………………………Page 743……………………………………………………………
第 12 章 列印與預樱А�
CView::OnFilePrint
CView::OnFilePrint
CDC::StartPage (macro; defined in AFXWIN1。INL)
CDC::StartPage
::StartPage (Win32 API)
::StartPage
⑤ 调用CView::OnPrint ,它的内部只有一个动作:调用OnDraw 。我们应该在
CScribbleView 中改写OnDraw 以绘出自己的图形。
CView ::OnFilePrint
CView ::OnFilePrint
CView ::OnPrint
CView ::OnPrint
CScribbleView ::OnDraw (我们应该改写OnDraw 以绘出自己的图形)
CScribbleView ::OnDraw
一页结束,调用一页结束,调用dcPrintdcPrint。。EndPageEndPage
CView ::OnFilePrint
CView ::OnFilePrint
CDC::EndPage (macro; defined in AFXWIN1。INL)
CDC::EndPage
::EndPage (Win32 API)
::EndPage
文件结束,调用EndDoc
CView::OnFilePrint
CView::OnFilePrint
CDC::EndDoc
CDC::EndDoc (macro; defined in AFXWIN1。INL)
::EndDoc (Win32 API)
::EndDoc
整个打印工作结束。如果有些什么绘图资源需要释放,你应该改写OnEndPrinting 函
式并在其中释放之。
CView::OnFilePrint
CView::OnFilePrint
CScribbleView::OnEndPrinting
CScribbleView::OnEndPrinting
681
…………………………………………………………Page 744……………………………………………………………
第篇 深入 MFC 程式設計
去除【打印状态】对话框。
将「打印机DC 」解除附着,CPrintInfo 的析构式会把DC 还给Windows 。
从上面这些分析中归纳出来的结论是,一共有六个虚拟函数可以改写,请看图12…5。
Framework 调用次序 建议改写项目
CMyView::OnPreparePrinting 设定Document 长度。调用CView::DoPreparePrinting 以显示
CMyView::OnPreparePrinting 【Print】对话框并产生打印机DC。
CMyView::OnBeginPrinting 设定以DC 为准的Document 长度;配置GDI 资源
CMyView::OnBeginPrinting
CDC::StartDoc
CDC::StartDoc
CMyView::OnPrepareDC 改变viewport 原点、剪截区、以及其它DC 属性。
CMyView::OnPrepareDC
CDC::StartPage
CDC::StartPage
CMyView::OnPrint 列打印头、页尾等等
CMyView::OnPrint
CMyView::OnDraw GDI 绘图动作
CMyView::OnDraw
CDC::EndPage
CDC::EndPage
CDC::EndDoc
CDC::EndDoc
CMyView::OnEndPrinting 释放GDI 资源
CMyView::OnEndPrinting
图12…5 MFC 打印流程与我们的着力点
682
…………………………………………………………Page 745……………………………………………………………
第 12 章 列印與預樱А�
以下是图12…5 的补充说明。
■当使用者按下【File/Print 】命令项, Application Framework 首先调用
CMyView::OnPreparePrinting 。这个函数接受一个CPrintInfo 指针做为参数,允许
使用者设定Document 的打印长度(从第几页到第几页)。预设页码是1 至
0xFFFF , 程序员应该在OnPreparePrinting 中调用SetMaxPage 预设页数。
SetMaxPage 之后,程序应该调用CView::DoPreparePrinting ,它会显示【打印】
对话框,并产生一个打印机DC 。当对话框结束,CPrintInfo 也从中获得了使用
者设定的各个打印项目(例如从第n1 页印到第n2 页) 。
Framework 如何得知使用者对于打印状态的设定?CPrintInfo 有五个函数可用,下一
节有更详细的说明。
■针对每一页,Framework 会调用CMyView::OnPrepareDC,这函数在前一章介绍
CScrollView 时也曾提过,当时是因为我们使用卷动窗口,而由于卷动的关系,
绘图之前必须先设定DC 的映射模式和原点等性质。这次稍有不同的是,它收
到打印机DC 做为第一参数,CPrintInfo 对象做为第二参数。我们改写这个函
式,使它依目前的页码来调整DC ,例如改变打印原点和截割区域以保证印出
来的Document 内容的合适性等等。
■稍早我一再强调所有绘图动作都应该集中在OnDraw 函数中,Framework 会自
动调用它。更精确地说,Framework 其实是先调用OnPrint,传两个参数进去,
第一参数是个DC , 第二参数是个CPrintInfo 指针。OnPrint 内部再调用
OnDraw,这次只传DC 过去,做为唯一参数:
// in VIEWCORE。CPP
void CView::OnPrint(CDC* pDC; CPrintInfo*)
{
ASSERT_VALID(pDC);
// Override and set printing variables based on page number
OnDraw(pDC); // Call Draw
}
683
…………………………………………………………Page 746……………………………………………………………
第篇 深入 MFC 程式設計
有了这样的差异,我们可以这么区分这两个函数的功能:
z OnPrint:负责「只在打印时才做(屏幕显示时不做)」的动作。例如印出
表头和页尾。
z OnDraw :共通性绘图动作(包括输出到屏幕或打印机上)都在此完成。
看看另一�