Условное прекращение закрытия 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
.