对将要打印的每一页,应用程序框架都会调用视图类的两个成员函数:OnPrepareDC()函数和OnPrint()函数,并传递给这两个函数两个参数:一是指向CDC对象的指针,一是指向CPrintInfo对象的指针。当应用程序框架每次调用这两个函数的时候,通过CPrintInfo对象的m_nCurPage成员传递过来的值是不同的。应用程序框架通过这种方式告知视图类哪一页将被打印。
OnPrepareDC()函数也用于显示设备环境,该函数在真正执行绘图任务前调整设备环境的属性。在打印任务中,OnPrepareDC()函数的作用也是类似的。但存在着两点差别:一是此时CDC对象代表的是打印设备环境,而非显示设备环境;一是CPrintInfo对象作为第二个参数被传递过来(在显示任务时该参数为NULL)。重载OnPrepareDC()函数可以调整与打印页有关的设备环境的属性。比如说,可以改变视口位置或剪贴区域已保证打印文档的相应部分。
OnPrint()函数完成真正的打印一页的工作,在OnPrint()函数中又调用了OnDraw()函数。重载OnPrint()函数可以进行只对打印才有用的修饰工作。比如说,可以在OnPrint()函数进行页眉与页脚的打印,然后调用OnDraw()函数完成打印和显示都需要的工作。
图6-16清楚地展现了MFC应用程序打印过程的步骤及各有关函数的调用顺序。如果用户需要实现更完美的打印和打印预览功能,还需要在图6-16的基础上做更多的努力。
MFC通过CView类实现了对打印和打印预览功能的支持,简单地覆盖OnDraw()函数就可以实现最基本的打印功能。OnDraw()函数既可以在屏幕上绘图,也可以在一个真实的打印机设备环境上绘图,还可以在一个模拟打印机的设备环境上绘图。在基本打印功能的基础上,用户可以添加自己的代码以实现较为复杂的打印功能。当然,用户如果要达到完美的输出效果,肯定需要付出较多的努力。