Страница 47 из 238
CDialog
Класс
CDialog является родительским классом для пользовательских классов, используемый для отображения диалоговых окон на экране. Диалоговые окна могут быть модальными и немодальный. Модальное диалоговое окно должно быть закрыто пользователем прежде, чем приложение сможет продолжить свою работу. Немодальное диалоговое окно допускает работу пользователя с приложением до своего закрытия и удаления с экрана. Диалоговый объект является комбинацией шаблона диалога и одного из пользовательских классов, производных от класса
CDialog. Для создания шаблона диалога и сохранения его в файле ресурсов обычно используется редактор диалога. Запуск мастера ClassWizard из окна редактора диалога позволяет создать соответствующий данному диалоговому окну класс, производный от класса
CDialog. Диалоговое окно, подобно любому другому окну, получает сообщения от Windows. Основным назначением объекта пользовательского класса диалога является обработка сообщений, поступающих от объектов классов элементов управления данного диалогового окна, при взаимодействии пользователя с соответствующими элементами управления. Мастер ClassWizard просматривает потенциальные сообщения, которые может послать каждый элемент управления данного диалогового окна, и предоставляет пользователю возможность выбора тех сообщений, которые он действительно собирается обрабатывать. После выбора пользователем обрабатываемых сообщений, мастер ClassWizard добавляет соответствующие макросы в карту сообщения и создает заготовки функций обработки для данных сообщений в пользовательском классе диалогового окна. Все классы диалоговых окон, кроме самых простейших, содержат переменные для хранения информации, необходимой для работы с элементами управления диалогового окна. Мастер ClassWizard просматривает все классы элементов управления созданного пользователем диалогового окна и определяет, какие переменные могут понадобиться для работы с ними. Пользователь сам выбирает тип переменной и допустимый диапазон значений для каждой из создаваемых мастером переменных. После этого мастер ClassWizard добавляет описание соответствующих переменных в пользовательский класс диалога. После закрытия своего диалогового окна мастер ClassWizard составляет карту данных, позволяющую осуществлять автоматический обмен данными между переменными объекта класса диалогового окна и объектами классов элементов управления данного окна. Карта данных содержит функции, инициализирующие элементы управления диалогового окна соответствующими значениями, получающие информацию, содержащуюся в этих объектах, и проверяющие правильность передаваемой информации. Чтобы создавать модальное диалоговое окно, необходимо создать объект на стеке, используя конструктор пользовательского диалогового класса, присвоить его переменным исходные значения, а затем вызвать функцию
DoModal, создающую окно диалога и его элементы управления. Чтобы создать немодальный диалог, вызовите в конструкторе вашего диалогового класса функцию
Create. Одним из способов создания диалогового окна является создание в памяти объекта структуры
DLGTEMPLATE. Для этого, после создания указателя на объект класса
CDialog вызовите функцию
CreateIndirect для создания немодального диалогового окна, или вызовите функции
InitModalIndirect и
DoModal для создания модального диалогового окна. Мастер ClassWizard помещает функции обмена и проверки правильности информации в функцию
CWnd::DoDataExchange, которую он же и включает в класс пользовательского диалогового окна. Вызов данной функции обычно осуществляется в функции
CWnd::UpdateData. Приложение вызывает функцию
UpdateData, когда пользователь нажимает кнопку OK, чтобы закрыть модальное диалоговое окно. (Данные не обновляются при нажатии кнопки Cancel (Отмена)). Заданная по умолчанию реализация функции
OnInitDialog вызывает функцию
UpdateData, чтобы установить начальные значения переменных в объектах классов элементов управления. Обычно пользователь перегружает функцию
OnInitDialog для проведения нестандартных операций по инициализации объектов классов элементов управления. Функция
OnInitDialog вызывается после создания всех объектов классов элементов управления в диалоговом окне и непосредственно перед отображением диалогового окна на экране. Пользователь может вызывать функцию
CWnd::UpdateData в любой функции класса модального или немодального диалогового окна. Для установки цвета фона диалогового окна в приложении используется функция
CWinApp::SetDialogBkColor. Модальное диалоговое окно закрывается автоматически, когда пользователь нажимает кнопки OK или Cancel (Отмена) или когда программа непосредственно вызывает функцию
EndDialog. При создании класса немодального диалогового окна необходимо всегда перегружать функцию
OnCancel и вызывать в ней функцию
DestroyWindow. При этом не следует вызывать функцию базового класса
CDialog::OnCancel, поскольку она вызывает функцию
EndDialog, которая сделает данное диалоговое окно невидимым, но не уничтожит его класс. Кроме того, при создании классов немодальных диалоговых окон необходимо перегрузить функцию
PostNcDestroy, добавив в него оператор
delete this, поскольку немодальные диалоговые окна обычно создаются оператором new. Объекты классов модальных диалоговых окон обычно являются локальными объектами функций и не нуждаются в самоликвидации в перегруженной функции
PostNcDestroy. Описание данного класса содержится в файле заголовка afxwin.h.