PSN_QUERYCANCEL не закрывает лист свойств

У меня есть лист свойств, который я создал, и каждая из вкладок имеет один и тот же pfnDlgProc. В pfnDlgProc у меня есть этот код:

switch (msg) {
    case WM_NOTIFY:
        nmhdr = (NMHDR*)lParam;

        switch (nmhdr->code) {
            case PSN_QUERYCANCEL:
                printf("PSN_QUERYCANCEL\n");
                SetWindowLong(nmhdr->hwndFrom, DWL_MSGRESULT, FALSE);

                return TRUE;
        }

        break;

    ...
}

Когда я нажимаю кнопку «Отмена» на листе свойств, печатается PSN_QUERYCANCEL, но лист свойств не закрывается. Почему это? Есть ли что-то еще, что мне нужно сделать, чтобы позволить ему закрыться? Я знаю, что могу добавить DestroyWindow(nmhdr->hwndFrom) в обработчик, но правильно ли это сделать?


person Seth Carnegie    schedule 16.08.2011    source источник


Ответы (1)


Вы устанавливаете DWL_MSGRESULT для дескриптора окна, которое отправило вам уведомление, но не обязательно для окна, которое является диалоговым окном, для которого вы обрабатываете WM_NOTIFY. Вместо использования дескриптора окна nmhdr->hwndFrom попробуйте использовать HWND, переданный вашему pfnDlgProc.

person Ben Goodwyn    schedule 14.09.2011