Предполагая, что мы имеем дело с окном верхнего уровня, реализованным здесь как подкласс CDialog, это окно может получать два "вида" событий закрытия:
- События закрытия приложения (WM_SYSCOMMAND с идентификатором SC_CLOSE)
- События закрытия окна (WM_COMMAND с идентификатором IDOK или IDCANCEL)
MFC, однако, эффективно направляет прежний класс событий через CDialog :: OnCancel по умолчанию, когда они отправляются в диалог, что означает, что переопределение OnCancel также прерывает Alt-F4 и кнопку X Это означает, что для того, чтобы различать два, вам нужно обрабатывать первые события в OnSysCommand, используя переопределения OnOK и OnCancel для обработки последних.
Полученный код выглядит примерно так:
class CTopLevelDlg: public CDialog
{
afx_win void OnSysCommand(UINT id, LPARAM lparam) override
{
if (id == SC_CLOSE)
CDialog::OnCancel();
}
void OnOK() override {}
void OnCancel() override {}
};