自定义 MFC 应用程序中默认打印对话框的简便方法






4.62/5 (17投票s)
一种快速简便的方法来定制 MFC 应用程序中的 CPrintDialog 对象
概述
CPrintDialog
对话框是一个标准的系统资源,几乎所有需要打印的程序都会使用它。但是,如果您需要自定义它怎么办?我在这里介绍一种快速简便的方法来实现这一点。
第一阶段:复制通用对话框资源模板
第一阶段是在您的项目中创建 CPrintDialog
类使用的现有对话框模板的精确副本。我通过复制默认源并将其粘贴到我的应用程序的 .rc 文件中来完成此操作。这些默认内容可以在您的 Visual C++ VC98\Include 目录中的 PrnSetup.Dlg 文件中找到。实际上,所有通用对话框的默认对话框模板都可以在这里找到,因此如果您需要知道特定控件的 ID 号,这就是查找的地方! 另请参阅 Dlgs.h 文件,其中包含所有通用对话框模板上实际控件的 #define
定义。
PRINTDLGORD DIALOG DISCARDABLE 32, 32, 288, 186
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU |
DS_CONTEXTHELP | DS_3DLOOK
CAPTION "Print"
FONT 8, "MS Sans Serif"
BEGIN
GROUPBOX "Printer",grp4,8,4,272,84,WS_GROUP
LTEXT "&Name:",stc6,16,20,36,8
COMBOBOX cmb4,52,18,152,152,CBS_DROPDOWNLIST | CBS_SORT |
WS_VSCROLL | WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Properties",psh2,212,17,60,14,WS_GROUP
LTEXT "Status:",stc8,16,36,36,10,SS_NOPREFIX
LTEXT "",stc12,52,36,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Type:",stc7,16,48,36,10,SS_NOPREFIX
LTEXT "",stc11,52,48,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Where:",stc10,16,60,36,10,SS_NOPREFIX
LTEXT "",stc14,52,60,224,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
LTEXT "Comment:",stc9,16,72,36,10,SS_NOPREFIX
LTEXT "",stc13,52,72,152,10,SS_NOPREFIX | SS_LEFTNOWORDWRAP
CONTROL "Print to fi&le",chx1,"Button",BS_AUTOCHECKBOX |
WS_GROUP | WS_TABSTOP,212,70,64,12
GROUPBOX "Print range",grp1,8,92,144,64,WS_GROUP
CONTROL "&All",rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |
WS_TABSTOP,16,106,64,12
CONTROL "Pa&ges",rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12
CONTROL "&Selection",rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,
12
RTEXT "&from:",stc2,52,124,20,8
EDITTEXT edt1,74,122,26,12,WS_GROUP | ES_NUMBER
RTEXT "&to:",stc3,100,124,16,8
EDITTEXT edt2,118,122,26,12,WS_GROUP | ES_NUMBER
GROUPBOX "Copies",grp2,160,92,120,64,WS_GROUP
LTEXT "Number of &copies:",stc5,168,108,68,8
EDITTEXT edt3,240,106,32,12,WS_GROUP | ES_NUMBER
ICON "",ico3,162,124,76,24,WS_GROUP | SS_CENTERIMAGE
CONTROL "C&ollate",chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP |
WS_TABSTOP,240,130,36,12
DEFPUSHBUTTON "OK",IDOK,180,164,48,14,WS_GROUP
PUSHBUTTON "Cancel",IDCANCEL,232,164,48,14
END
您需要对其进行略微修改。在上面的示例中,您需要将 PRINTDLGORD
更改为要在自己的应用程序中本地调用的对话框资源的名称。在我的例子中,这是 IDD_PRINT
。 确保在执行此操作时,#define IDD_PRINT x
存在于您的 resource.h 文件中。
第二阶段:添加控件并包装对话框模板
将任何控件添加到对话框并根据需要进行布局,然后调用 ClassWizard
,以便您可以将新的对话框资源包装在一个类对象中。 随意命名它,但请确保将基类选择为 CPrintDialog
。 创建后,您可以添加消息处理程序等,用于添加到对话框资源中的任何额外按钮。
第三阶段:使用新的 CMyPrintDialog 类
要使您的应用程序使用这个新的 CPrintDialog
对话框,您需要在 CView::OnPreparePrinting()
函数中添加以下代码
// replace the standard CPrintDialog with our custom one!
delete pInfo->m_pPD ; // release previous MFC allocated dialog object
pInfo->m_pPD = new CMyPrintDialog(false) ;
pInfo->m_pPD->m_pd.nMinPage = 1 ;
pInfo->m_pPD->m_pd.nMaxPage = 0xffff ;
pInfo->m_pPD->m_pd.hInstance = AfxGetInstanceHandle() ;
pInfo->m_pPD->m_pd.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINT) ;
pInfo->m_pPD->m_pd.Flags |= PD_ENABLEPRINTTEMPLATE ;
第四阶段:编译并运行您的应用程序
完成了!您只需要从那里编写您的处理程序即可!
尽情享用!