Итак, кажется, что MFC не предназначен для такой работы.
Но самое простое решение, которое я нашел, было изменить DoDataExchange()
следующим образом:
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// DDX and DDV calls go here
if (pDX->m_bSaveAndValidate)
{
if (!SaveData())
pDX->Fail();
}
}
КодПриведенное выше основывается на SaveData()
, отображающем сообщение об ошибке и возвращающем ложь в случае обнаружения каких-либо ошибок.
В результате выполняется регулярная проверка перед тем, как я пытаюсь сохранить свои данные. И, если код, сохраняющий данные, дает сбой, я все равно могу предотвратить закрытие диалогового окна с помощью той же техники, что и методы проверки MFC. (А именно, позвонив по номеру pDX->Fail()
).