Визуальное программирование и MFC

       

Класс диалоговой панели


Класс главной диалоговой панели объявляется в файле dlgDlg.h и реализуется в файле dlgDlg.cpp.

Объявление класса

Класс CDlgDlg наследуется от базового класса CDialog, определенного в библиотеке классов MFC. Конструктор класса имеет один необязательный параметр pParent, используемый для передачи индекса главного окна приложения. Роль главного окна выполняет сама диалоговая панель, поэтому параметр pParent не используется.

Непосредственно после объявления конструктора класса следует объявление элементов данных класса, которые добавлены средствами MFC AppWizard. Не рекомендуется вручную изменять код приложения, расположенный между комментариями AFX_DATA, между которыми заключены эти объявления.

Далее AppWisard добавляет объявления переопределенных виртуальных методов базового класса. Сначала объявлен только метод DoDataExchange, переопределенный для данной диалоговой панели. Этот метод применяется для связывания органов управления диалоговой панели с элементами управляющего ею класса.

Практически со всеми приложениями связана пиктограмма, которая будет отображаться при минимизации приложения. Обычно эта пиктограмма определяется на этапе регистрации класса главного окна приложения. Приложение dlg не имеет настоящего главного окна - вместо него используется диалоговая панель. Поэтому отображение пиктограммы не происходит автоматически, и, следовательно, необходимо управлять ее отображением (идентификатор пиктограммы m_hIcon определен в классе CDlgDlg).

Диалоговая панель CDlgDlg будет обрабатывать ряд сообщений. Объявления обработчиков сообщений, созданных при помощи AppWizard, располагаются между комментариями AFX_MSG. После создания проекта в нем объявлены обработчики 4-х сообщений: OnInitDialog, OnSysCommand, OnPaint и OnQueryDragIcon.

Конструктор класса

Конструктор класса CDlgDlg вызывает конструктор базового класса CDialog. При этом ему передаются идентификатор диалоговой панели и идентификатор главного окна приложения.

В теле конструктора расположен блок AFX_DATA_INIT.
В него ClassWizard будет добавлять код инициализации элементов данных класса CDlgDlg.



Конструктор также инициализирует m_hIcon, записывая в него идентификатор пиктограммы IDR_MAINFRAME:

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

Метод AfxGetAp возвращает указатель на объект главного класса приложения (в данном случае - указатель на объект theApp).



Метод DoDataExchange



Диалоговая панель имеет только кнопки и не имеет связанных с ними переменных. Однако метод DoDataExchange переопределен. Фактически он не выполняет никакой работы. Единственное, что он делает, - это вызывает метод DoDataExchange базового класса CDialog.

Если к диалоговой панели добавить новые органы управления и связать их средствами ClassWizard с элементами данных класса CDlgDlg, то в блоке AFX_DATA_MAP будут размещены вызовы функций DDX и DDV, необходимые для выполнения обмена данными.



Таблица сообщений



Таблица сообщений класса CDlgDlg содержит три макрокоманды, которые выполняют обработку сообщений WM_SYSCOMMAND, WM_PAINT и WM_QUERYDRAGICON. Они расположены в блоке AFX_MSG_MAP, поэтому для управления ими используется ClassWizard.



Метод OnInitDialog



При отображении диалоговой панели при помощи функций DoModal, Create или CreateIndirect, функция диалоговой панели передается сообщение WM_INITDIALOG. Непосредственного доступа к функции диалога нет. Ее реализация содержится в классе CDialog.

В ответ на сообщение WM_INITDIALOG вызывается метод OnInitDialog, объявленный как виртуальный метод класса CDialog. Этот метод вызывается непосредственно перед выводом панели на экран.

MFC AppWizard в реализацию этого метода добавил несколько действий: добавление строки к системному меню для вызова краткой справки о приложении, а также при помощи метода SetIcon выбрал пиктограмму для приложения.

Метод OnInitDialog возвращает значение TRUE. Это означает, что фокус ввода будет установлен на первый орган управления диалоговой панели. Первый орган диалоговой панели можно выбрать в редакторе диалоговой панели.



Если во время инициализации диалоговой панели метод OnInitDialog устанавливает фокус ввода другому органу управления, метод должен вернуть значение FALSE.



Метод OnSysCommand



Если при создании шаблонного приложения указать возможность отображения краткой справочной информации, то при этом средство AppWizard подготовит фрагмент кода, добавляющий соответствующую строку в системное меню, а также метод-обработчик OnSysCommand сообщений от системного меню.

Этот метод имеет два параметра - идентификатор строки системного меню, которую выбрал пользователь, и параметр, содержащий координаты мыши, если выбор сделан мышью.

Для обработки выбора стандартных пунктов меню переопределенный метод вызывается метод-обработчик базового класса (для обработки сообщений по умолчанию), а для добавленных пунктов выполняется специфическая обработка.



Метод OnPaint



Диалоговая панель в отличие от обычного окна не содержит встроенных средств отображения пиктограммы приложения. Приложение должно само заботиться об отображении пиктограммы - для этого переопределяется метод OnPaint. В этом методе либо вызывается метод OnPaint базового класса, либо приложение само отображает пиктограмму, если оно в данный момент минимизировано.



Метод OnQueryDragIcon



Пользователь может “перетащить” пиктограмму минимизированного приложения. Если пользователь производит это действие с пиктограммой окна, для класса которого не определена пиктограмма, то вызывается метод OnQueryDragIcon. Этот метод должен вернуть идентификатор курсора мыши, который будет отображаться в момент “перетаскивания” пиктограммы окна.

В переопределенном методе OnQueryDragIcon средство AppWizard просто возвращает идентификатор пиктограммы приложения.


Содержание раздела