我正在尝试实现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指针崩溃
答案 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;