Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб 5.doc
Скачиваний:
3
Добавлен:
08.05.2019
Размер:
462.34 Кб
Скачать

Обработка сообщений класса сMyDialog.

Класс диалоговой панели должен обрабатывать сообщения от своих органов управления, поэтому он должен иметь таблицу сообщений. В заголовке таблицы сообщений указывается имя класса CMyDialog и имя базового класса CDialog. Таблица сообщений диалоговой панели приложения dlg1 содержит только одну строку, в которой обрабатывается сообщение с кодом извещения ON_BN_CLICKED от кнопки "Сброс".

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)

//{{AFX_MSG_MAP(CMyDialog)

ON_BN_CLICKED(IDC_RESET, OnReset)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

Когда пользователь нажимает кнопку, вырабатывается данное сообщение и вызывается его обработчик - метод OnReset, определенный в классе CMyDialog.

Две другие кнопки панели - "OK" и "Отмена" - не представлены в таблице сообщений, но в приложении определен методы OnOk , который вызывается при нажатии на кнопку OK. С кнопкой "Отмена" связан идентификатор IDCANCEL. При нажатии на эту кнопку вызывается стандартный обработчик события. Для диалоговых панелей определены две стандартные кнопки - "Ok" и "Cancel", которым присвоены специальные идентификаторы IDOK и IDCANCEL.

Базовый класс CDialog, так же как и класс CMyDialog, содержит таблицу сообщений. Среди прочих сообщений в этой таблице определены командные сообщения с идентификаторами IDOK и IDCANCEL. Для обработки этих командных сообщений определены виртуальные методы OnOk и OnCancel. Поэтому, когда диалоговая панель содержит кнопки с идентификаторами IDOK и IDCANCEL, как правило, нет необходимости создавать для них обработчики, если по этим кнопкам выполняются стандартный действия.

Так как в таблице сообщений класса CMyDialog отсутствует макрокоманды для обработки сообщений от кнопок "Ok" и "Cancel", они передаются для обработки базовому классу CDialog. Здесь они обрабатываются виртуальными методами OnOk и OnCancel.

Метод OnOk, определенный в классе CDialog, копирует данные из полей диалоговой панели в связанные с ними переменные. Для этого вызывается метод UpdateData с параметром True. Затем выполняется вызов метода EndDialog, который закрывает диалоговую панель и возвращает значение IDOK. Метод DoModal прекращает работу и возвращает IDOK.

Метод OnCancel, определенный в классе CDialog, еще проще, чем OnOk. Он только закрывает диалоговую панель и возвращает значение IDCANCEL. Копирование данных не происходит, так как пользователь отменил изменения, нажав кнопку "Cancel".

Так как методы OnOk и OnCancel определены в классе CDialog как виртуальные, то можно переопределить их в классе CMyDialog. В этом случае управление получат переопределенные методы, а не методы класса CDialog. Методы базового класса можно вызвать, явно указав класс CDialog.

Несмотря на то, что диалог представляет обычное окно Windows, для него есть специфические сообщения. Одно из основных - сообщение WM_INITDIALOG. Это сообщение посылается процедуре диалога при выполнении функций DoModal, Create после того, как элементы созданы, но окно диалога не видно. В ответ на это сообщение вызывается функция

virtual BOOL OnInitDialog( ). Эту функцию чаще всего необходимо переопределить для выполнения специфических установок для элементов блока диалога: например, установки значение в списки, задания начальных значений текстовых блоков и т.д.

Для завершения работы с модальным диалогом необходимо вызвать функцию virtual BOOL EndDialog(int nResult ). Эта функция вызывается в обработчике OnOK и ONCancel для модального диалога. nResult - возвращаемое значение. Для немодального диалога функцию OnOK обязательно нужно переопределять, так как EndDialog делает диалог невидимым, но не уничтожает его, поэтому нужен вызов функции DestroyWindow().