Как добавить страницу свойств в CPrintDialogEx - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь реализовать 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 Ответ

3 голосов
/ 18 июня 2019
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;
...