- •Диалоговая панель
- •Приложение с модальной диалоговой панелью
- •Создание диалоговой панели с помощью редактора ресурсов.
- •Создание приложения с модальной диалоговой панелью.
- •Обмен данными.
- •Обработка сообщений класса сMyDialog.
- •Приложение с немодальной диалоговой панелью
- •Некоторые функции для работы с диалоговыми панелями.
- •Пример оформления «Технического задания»
- •5. Требования к программной документации
- •1. Введение
- •2. Основание для разработки
- •3. Назначение
- •1. Введение
- •2. Основание для разработки
- •3. Назначение
- •4.2. Требования к надежности
- •6. Этапы разработки
Обработка сообщений класса с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().