Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT | страница 76
Базовый класс CDialog, также как и класс CMyDialog, содержит таблицу сообщений. Если вы установили библиотеку MFC вместе с исходными текстами, вы можете изучить реализацию класса CDialog в файле Dlgcore.cpp. Сам класс CDialog определен во включаемом файле Afxwin.h. Ниже представлена выдержка из таблицы сообщений, определенной в файле Dlgcore.cpp:
>BEGIN_MESSAGE_MAP(CDialog, CWnd)
> //{{AFX_MSG_MAP(CDialog)
> ON_WM_CTLCOLOR()
> ON_COMMAND(IDOK, OnOK)
> ON_COMMAND(IDCANCEL, OnCancel)
> ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp)
> ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest)
> ON_MESSAGE(WM_QUERY3DCONTROLS, OnQuery3dControls)
> ON_MESSAGE(WM_INITDIALOG, HandleInitDialog)
> ON_MESSAGE(WM_SETFONT, HandleSetFont)
> //}}AFX_MSG_MAP
>END_MESSAGE_MAP()
Среди прочих сообщений, в этой таблице определены командные сообщения с идентификаторами IDOK и IDCANCEL. Для обработки этих командных сообщений определены виртуальные методы OnOK и OnCancel. Данные методы также определены в MFC (файл Dlgcore.cpp). Поэтому когда диалоговая панель содержит кнопки с идентификаторами IDOK и IDCANCEL, как правило нет необходимости создавать для них обработчики.
Так как в таблице сообщений класса CMyDialog отсутствуют макрокоманды для обработки сообщений от кнопок OK и Cancel, они передаются для обработки базовому классу CDialog. Здесь они обрабатываются виртуальными методами OnOK и OnCancel.
Метод OnOK, определенный в классе CDialog, копирует данные из полей диалоговой панели в связанные с ними переменные. Для этого вызывается метод UpdateData с параметром TRUE. Затем выполняется вызов метода EndDialog, который закрывает диалоговую панель и возвращает значение IDOK. После того как диалоговая панель закрыта, метод DoModal возвращает значение IDOK и продолжает работать метод InitInstance.
>void CDialog::OnOK() {
> if (!UpdateData(TRUE)) {
> // В процессе обмена данными произошла ошибка
> TRACE0("UpdateData failed during dialog termination.\n");
> return;
> }
> EndDialog(IDOK);
>}
Метод OnCancel, определенный в классе CDialog, еще проще, чем OnOK. Он только закрывает диалоговую панель и возвращает значение IDCANCEL. Копирование данных из полей диалоговой панели не происходит, так как пользователь отменил изменения, нажав кнопку Cancel.
>void CDialog::OnCancel() {
> EndDialog(IDCANCEL);
>}
Так как методы OnOK и OnCancel определены в классе CDialog как виртуальные, вы можете переназначить их в своем классе CMyDialog. В этом случае управление получат переопределенные вами методы, а не методы класса CDialog. Методы базового класса CDialog можно вызвать, явно указав класс.