1.打印结构
- PrintDocument:打印的基类,也是打印过程中最重要的类。要打印一个文档,必须先创建一个该类的实例。通常,会创建PrintDocument类的实例,并设置对打印内容进行描述的属性,然后调用其Print()方法来实际打印文档。
- PrintController:控制打印任务流。打印控制器类PrintController提供了打印开始、打印每个页面和打印结束控制。该类是抽象类,真正完成打印任务的是具体类StandardPrintController和PreviewPrintController。
- PrinterSettings:使用PrinterSettings类可以获取打印和设置打印机配置。例如,双面打印,横向打印或纵向打印、打印份数等。该类的配置由PageSetupDialog类进行。
- PrintDialog:确定使用哪个打印机和如何配置PrinterSettings
- PageSettings:设置打印页面,可以设置页面是彩色还是黑白。该类的配置也由PageSetupDialog类进行。
- Graphics:使该类可以访问打印机的设备内容,为打印机发送字符串、线条和曲线。
这些类按照下图所示的打印序列来完成打印任务。
应用程序必须先调用PrintDocument的Print()方法,以启动打印序列。因为PrintDocument本身并不负责打印流,所以会调用打印控制器PrintController类的OnStartPrint、OnEndPrint、OnStartPage和OnEndPage方法,指示打印机如何打印文档。
打印控制器PrintController通过调用OnBeginPrint()方法通知PrintDocument开始打印。如果应用程序应在打印任务的开始执行时某些操作,就必须在PrintDocument中注册一个事件处理程序,这样才会在应用程序中接到通知消息。在图中,假定注册了处理程序OnBeginPrint(),那么在打印开始时PrintDocument类会调用应用程序的OnBeginPrint()方法。
在开始阶段完成后,PrintController就进入PrintLoop(),为每个要打印的页面调用PrintDocument类的OnPrintPage()方法,而OnPrintPage()方法会调用所有的PrintPage事件处理程序。因此,必须对每个页面执行该处理程序,否则不会打印任何内容。在图中,该处理程序为nPrintPage()。
在打印完最后一页后,PrintController就会调用PrintDocument类的OnEndPrint()方法,结束打印任务。
总之,可以在PrintDocument.PrintPage处理程序中执行打印代码,每个要打印的页面都要调用该处理程序。如果打印任务只需要执行一次打印代码,就必须执行BeginPrint和EndPrint事件处理程序。
PrintPage事件处理程序接收一个PrintPageEventArgs类型的参数。该类与PageSettings和Graphics类相关联:PageSettings类可以设置页面的大小、页边距,以及获取打印机的设备信息。另一方面,Grahics类可以访问打印机的设备内容,为打印机发送字符串、线条和曲线信息。
2.添加打印功能
在添加PrintDialog之前先添加一些打印菜单项。为“文件菜单项添加两个分隔符,以及“页面设置”, “打印预览”和
“打印”及“退出”菜单项。