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 можно вызвать, явно указав класс.