【问题标题】:How do I add a property page to CPrintDialogEx如何将属性页添加到 CPrintDialogEx
【发布时间】:2019-06-17 21:02:29
【问题描述】:

我正在尝试实现 CPrintDialogEx。我有一些其他需要的选项,我想在窗口中添加另一个属性页。没有 MFC 示例,尝试 Win API 示例失败得很惨。它兑现。我做错了什么?

CPrintDialogEx dlg;
PROPSHEETPAGE optionsPage1;
HPROPSHEETPAGE hOptionsPage;
memset(&optionsPage1, 0, sizeof(PROPSHEETPAGE));
optionsPage1.dwSize = sizeof(PROPSHEETPAGE);
optionsPage1.dwFlags = PSP_DLGINDIRECT;
optionsPage1.hInstance = AfxGetInstanceHandle();
optionsPage1.pszTemplate = MAKEINTRESOURCE(IDD_QREPORT_OPTIONS);
optionsPage1.pResource = (DLGTEMPLATE*)IDD_QREPORT_OPTIONS;
optionsPage1.hIcon = NULL;
optionsPage1.pszIcon = NULL;
optionsPage1.pszTitle = "Options";
optionsPage1.pfnDlgProc = AfxWndProc; 
optionsPage1.lParam = NULL;
dlg.m_pdex.nPropertyPages = 1;
hOptionsPage = CreatePropertySheetPage(&optionsPage1);
dlg.m_pdex.lphPropertyPages = &hOptionsPage;
if (dlg.DoModal() == IDOK)

空指针崩溃

【问题讨论】:

    标签: c++ windows visual-c++ mfc


    【解决方案1】:
    optionsPage1.dwFlags = PSP_DLGINDIRECT;
    ...
    optionsPage1.pResource = (DLGTEMPLATE*)IDD_QREPORT_OPTIONS;
    

    IDD_QREPORT_OPTIONS 是一个整数,不应强制转换为DLGTEMPLATE*。这样做会将pResource 指向某个随机内存地址,这可能会导致崩溃。

    反正你不需要pResource。将PSP_DLGINDIRECT 替换为PSP_DEFAULT,这将指示CreatePropertySheetPage 使用pszTemplate


    PROPSHEETPAGE 文档:

    pszTemplate

    输入:LPCSTR

    用于创建页面的对话框模板。该成员可以指定 模板的资源标识符或 指定模板名称的字符串。如果PSP_DLGINDIRECT dwFlags 成员中的标志被设置,pszTemplate 被忽略。该会员 被声明为与pResource 的联合。

    例子:

    INT_PTR CALLBACK dlgproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_COMMAND:
            if(LOWORD(wParam) == IDC_BUTTON1)
                MessageBox(hwnd, _T("test"), 0, 0);
            return 0;
        }
        return FALSE;
    }
    
    PROPSHEETPAGE optionsPage1 = { 0 };
    optionsPage1.dwSize = sizeof(PROPSHEETPAGE);
    optionsPage1.dwFlags = PSP_DEFAULT | PSP_USETITLE;
    optionsPage1.hInstance = AfxGetInstanceHandle();
    optionsPage1.pszTemplate = MAKEINTRESOURCE(IDD_QREPORT_OPTIONS);
    optionsPage1.pszTitle = _T("Options");
    optionsPage1.pfnDlgProc = dlgproc;// AfxWndProc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多