65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (17投票s)

2002年7月17日

CPOL

2分钟阅读

viewsIcon

242285

downloadIcon

2288

一种快速简便的方法来定制 MFC 应用程序中的 CPrintDialog 对象

Sample Image - PrintDialog.jpg

概述

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 ;

第四阶段:编译并运行您的应用程序

完成了!您只需要从那里编写您的处理程序即可!

尽情享用!

© . All rights reserved.