如何将属性页添加到CPrintDialogEx

时间:2019-06-17 21:02:29

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

我正在尝试实现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)

NULL指针崩溃

1 个答案:

答案 0 :(得分:3)

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;