Условное прекращение закрытия CPropertySheet из обработчика кнопки OnOK страницы

Я только что столкнулся с проблемой CPropertyPage.

Я пытался использовать OnOK обработчик для проверки:

void CCalendarSettingsGooglePage::OnOK()
{
    bool bHandle = false;

    UpdateData(TRUE);

    // AJT v20.2.0 — We need to pass "true" so that the error message will display!
    if (ValidSettings(true))
    {
        bHandle = true;
        SaveSettings();
    }

    if (bHandle)
        CMFCPropertyPage::OnOK();
}

Проблема в том, что лист все равно закрывается. Я надеялся, что предотвращениеCMFCPropertyPage::OnOKостановил бы закрытие листа. Но это не так.

Я понимаю отсюда, что лист OnOK делает EndDialog(IDOK)вызов. Но я не хочу усложнять себе лист. Тестирование здесь, на этой странице. поэтому мне нужно, чтобы лист знал, должен ли он закрываться или нет, когда пользователь нажимает кнопку ОК.

1 ответ

Решение

Вам нужно переопределить OnCommand обработчик родительского класса страницы свойств вашей страницы свойств и перехватить щелчки дляIDOK команда (которая будет дана в wParamпараметр). Если вы не вызываете базовый классOnCommandно все равно вернуться TRUE чтобы указать, что вы обработали команду, окно свойств не закроется:

BOOL MyPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
    if (wParam == IDOK) { // OK button clicked...
        if (!ValidSettings(true)) return TRUE; // NOT valid, prevent further processing.
    }
    // You can also intercept the "Apply" command by testing for ID_APPLY_NOW

    // Everything is OK, so continue processing ...
    return CMFCPropertySheet::OnCommand(wParam, lParam);
}

Обратите внимание: я предположил, что ваш родитель произошел от CMFCPropertySheet, но то же самое работает и для более старых CPropertySheet.

Другие вопросы по тегам