💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 8.5 打印对话框 你可以使用的打印对话框包括wxPageSetupDialog和wxPrintDialog以用来打印文档. 不过,如果你使用wxWidgets的打印框架(包括wxPrintout, wxPrinter以及其它一些类)的话,你的代码中很少需要显式的调用这些对话框.更多关于打印的细节请参考第5章, "绘画和打印." wxPageSetupDialog wxPageSetupDialog包含一些用来设置纸张大小(A4或者信纸大小等),打印方向(横向或者纵向),以毫米为单位的边框大小等控件还包括一个用来调用另外一个更详细打印设置对话框的按钮. 下图演示了wxPageSetupDialog对话框在windows系统上的样子: ![](img/mht65D2%281%29.tmp) 而下面的这个图则是wxWidgets自己实现的使用GTK+的通用的打印设置对话框: ![](img/mht65E5%281%29.tmp) 如果使用了Gnome的打印库,则GTK版本中的打印设置对话框将使用Gnome的原生对话框,如下图所示: ![](img/mht65E8%281%29.tmp) Mac版本的打印对话设置对话框图下图所示: ![](img/mht65FA%281%29.tmp) 要创建一个打印设置对话框,你需要传递的参数包括一个父窗口和一个指向wxPageSetupDialogData对象的指针,后者用于指定以及从对话框获取打印设置相关的数据,你可以以局部变量或者全局指针的方式创建打印设置对话框.构造函数中的打印设置数据将会被拷贝到打印设置对话框的内部数据中去,而GetPageSetupData函数可以用来获取一个打印设置对话框内部数据的引用. wxPageSetupData成员函数 Ok函数在其内部数据有效的情况下返回True,在windows平台上,如果没有设置默认的打印机,这个函数可能返回False,在其它平台上,这个函数总是返回True. SetMarginTopLeft函数使用wxPoint类型的参数以毫米为单位指定打印页面的左边距和上边距. GetMarginTopLeft则用来获取这两个边距. SetMarginBottomRight函数使用wxPoint类型的参数以毫米为单位设置打印页面的右边距和下边距. GetMarginBottomRight则用来获取这两个边距. SetPaperId使用标识符来代替具体的大小来设置页面大小. 参考这个函数在手册中的描述来获取相关的标识符. GetPaperId则用来获取当前设置的标识符. SetPaperSize采用一个wxSize参数来设置以毫米为单位的页面大小. GetPaperSize则用来获取对应的设置. EnableMargins允许或者禁用对话框上的边界控制控件(仅适用于Windows). GetEnableMargins用来获取这个设置的值. EnableOrientation用来允许或者禁止对话框上的打印方向控制控件(仅适用于Windows). GetEnableOrientation用来获取这个设置的值. EnablePaper用来允许或者禁止对话框上选择纸张大小的控件(仅适用于Windows). GetEnablePaper用来获取这个设置的值. EnablePrinter用来允许或者禁止打印机按钮,这个按钮用来调用另外一个打印设置对话框. GetEnablePrinter用来获取这个设置的值. wxPageSetupDialog使用举例 ``` #include "wx/printdlg.h" void MyFrame::OnPageSetup(wxCommandEvent& event) { wxPageSetupDialog pageSetupDialog(this, & m_pageSetupData); if (pageSetupDialog.ShowModal() == wxID_OK) m_pageSetupData = pageSetupDialog.GetPageSetupData(); } ``` wxPrintDialog 这个对话框用来显式打印及打印设置的标准对话框,当这个对话框关闭的时候你可以从中获得一个wxPrinterDC对象的实例. 下图演示了这个对话框在windows系统上的外观: ![](img/mht65FD%281%29.tmp) 下面的两幅图分别演示了GTK版本中没有使用Gnome打印库和使用了GNome打印库两种情况下对应的这个对话框的样子: ![](img/mht6610%281%29.tmp) ![](img/mht6613%281%29.tmp) 下图则演示了Mac OSX上对应的样子,从图中可以看到,Mac在标准对话框中提供了预览以及存为PDF文件的选项,你可以直接使用这个预览功能. ![](img/mht6625%281%29.tmp) 要创建一个wxPrintDialog对象,你需要提供的参数包括一个父窗口指针,一个wxPrintDialogData对象的指针, 后者的内容将被拷贝给打印对话框内部的对象.如果你希望显示一个打印设置对话框来代替打印对话框,你可以以True为参数调用 wxPrintDialogData:: SetSetupDialog函数,然后再将其传递给wxPrintDialog的构造函数.按照微软的说法,虽然打印设置对话框已经被 wxPageSetupDialog所取代,但是一些老的程序可能还在使用以前的标准,因此,这样作可以保证兼容性. 打印对话框被成功关闭的时候,你可以使用GetPrintDialogData函数来获取一个wxPrintDialogData的引用. 调用对话框的GetPrintDC函数来获取一个基于用户选项的打印设备上下文,如果这个函数的返回值不为空,应用程序应该自己释放这个被返回的对象. Ok函数在打印对话框内部数据有效的时候返回True,在windows平台上,如果没有设置默认的打印机,则Ok返回False,在其它平台上,这个函数总是返回True. wxPrintDialogData的成员函数 EnableHelp允许或者禁止对话框上的帮助按钮. GetEnableHelp用来获取对应的设置. EnablePageNumbers允许或者禁止页码设置控件, GetEnablePageNumbers用来获取对应的设置. EnablePrintToFile允许或者禁止打印到文件按钮. GetEnablePrintToFile用来获取对应的设置. EnableSelection允许或者禁止用于给用户选择打印范围的单选框. GetEnableSelection用来获取这个设置的值. SetCollate用来设置Collate复选框的值为True或者false. GetCollate来获取这个复选框的值. SetFromPage和SetToPage用来设置打印的起始页和终至页. 使用GetFromPage和GetToPage来获取相应的值. SetMinPage和SetMaxPage用来设置可以打印的最小页数和最大页数. GetMinPage和GetMaxPage则用来获取相应的值. SetNoCopies用来设置默认打印份数. GetNoCopies用来获取当前设置的打印份数. SetPrintToFile设置打印到文件的复选框的值. GetPrintToFile则用来获取这个值的当前设定. SetSelection用来设置打印范围单选框选项. GetSelection则用来返回这个选项的值. SetSetupDialog用来指示显示打印设置对话框还是打印对话框. GetSetupDialog来获取这个设置. SetPrintData设置内部的wxPrintData对象. GetPrintData则用来返回内部的wxPrintData对象的一个引用. wxPrintDialog使用举例 下面的例子演示了怎样显示一个打印对话框以便获取对应的打印上下文: ``` #include "wx/printdlg.h" void MyFrame::OnPrint(wxCommandEvent& event) { wxPrintDialogData dialogData; dialogData.SetFromPage(0); dialogData.SetToPage(10); wxPrintDialog printDialog(this, & m_dialogData); if (printDialog.ShowModal() == wxID_OK) { // 在调用GetPrintDC()以后, 应用程序 // 负责管理这个设备上下文 wxDC* dc = printDialog.GetPrintDC(); // 在这个设备上下文上绘画 ... // 然后释放它 delete dc; } } ``` 不过,通常你不需要自己直接调用打印对话框 .你应该使用wxWidgets提供的高层打印框架(参考第5章).在你调用wxPrinter::Print函数的时候将会自动显示打印对话框.