Условное прекращение закрытия CPropertySheet из обработчика кнопки OnOK страницы - PullRequest
2 голосов
/ 18 июня 2020

Я только что столкнулся с проблемой 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 Ответ

2 голосов
/ 18 июня 2020

Вам необходимо переопределить 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, но то же самое работает для «более старого» * ​​1018 *.

...