Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 11275 / 456 | Оценка: 4.12 / 4.01 | Длительность: 19:20:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 19:

Библиотека классов MFC среды проектирования Visual Studio .NET. Диалоги

< Лекция 18 || Лекция 19: 1234 || Лекция 20 >

Классы диалогов библиотеки MFC

Библиотека MFC содержит большой набор классов, предназначенных для создания диалоговых окон. На следующей схеме приведена иерархия классов диалогов, наследуемых от класса CDialog.

Класс CDialog

Класс CDialog является базовым классом, используемым для отображения на экране диалоговых окон, называемых также диалогами.

Есть два типа диалоговых окон - модальные и немодальные.

Как уже отмечалось, для реализации диалога следует создать в редакторе диалога шаблон диалогового окна, а затем с помощью ClassWizard (или вручную) создать производный класс от CDialog и определить в нем необходимые методы - обработчики сообщений для расположенных в используемом шаблоне диалога элементов управления.

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


Для создания диалоговых окон на основе существующего ресурса диалога можно использовать:

  • метод DoModal (для модального диалога);
  • метод Create (для немодального диалога);

Если шаблон диалога отсутствует, то можно создать шаблон диалога, используя структуру DLGTEMPLATE, а затем, после создания объекта диалога, вызвать методы CreateIndirect или InitModalIndirect и DoModal.

Модальное диалоговое окно автоматически закрывается при щелчке пользователя на кнопках типа OK или Cancel или при вызове метода EndDialog. Отметим, что метод EndDialog только скрывает окно диалога, а для его удаления следует использовать функцию DestroyWindow.

Для обмена значениями с элементом управления используется метод CWnd::UpdateData. Этот метод автоматически вызывается и при щелчке пользователя на кнопке типа OK, и при инициализации элементов управления методом OnInitDialog.

Метод OnInitDialog вызывается после создания всех элементов управления диалогового окна, но перед их отображением.

Для определения фона диалоговых окон используется метод CWinApp::SetDialogBkColor.

Последовательность создания диалогового окна включает следующие шаги:

  1. проектирование в редакторе диалога шаблона диалогового окна с включением в него всех требуемых элементов управления и настройки их свойств;
  2. создание класса, производного от CDialog, с описанием в нем переменных и обработчиков событий, а также указанием используемого шаблона диалога;
  3. определение для каждого элемента управления переменной или объекта, используемых для доступа к значению данного элемента управления;
  4. определение необходимых методов обработчиков событий для каждого элемента управления;
  5. создание объекта разработанного производного класса диалога (фактически вызов конструктора) и создание диалогового окна:
    Для модального диалога Для немодального диалога
    вызов конструктора с параметром, указывающим ID шаблона диалога вызов конструктора без параметра шаблона диалога
    вызов метода DoModal вызов метода Create с параметром, указывающим ID шаблона диалога
  6. переопределение метода OnInitDialog и включение в него вызова метода базового класса и необходимых действий по инициализации диалогового окна.

Класс CDialog предоставляет следующие конструкторы объекта:

CDialog (LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
CDialog (UINT nIDTemplate, CWnd* pParentWnd = NULL);
CDialog ();

Параметр lpszTemplateName - это строка, содержащая имя ресурса шаблона диалога, nIDTemplate - значение ID ресурса шаблона диалога. По умолчанию редактор ресурсов присваивает шаблонам диалога идентификаторы, начинающиеся с префикса IDD_. Параметр pParentWnd задает указатель на родительское окно или окно собственник (типа CWnd ), которому принадлежит этот диалог. Значение NULL показывает, что родительским окном является главное окно приложения.

Конструктор без параметров используется для создания модального окна диалога на основе шаблона, расположенного в памяти. При этом применяется метод InitModalIndirect. Для создания модального диалога после вызова конструктора следует вызвать метод DoModal.

Класс CDialog предоставляет следующие методы Create для создания немодального диалога:

BOOL Create (LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create (UINT nIDTemplate, CWnd* pParentWnd = NULL);

При успешном завершении создания диалогового окна и инициализации эти методы возвращают ненулевое значение.

Если в шаблоне диалога не установлен стиль WS_VISIBLE, то для отображения диалога необходимо вызвать метод ShowWindow.

Класс CDialog предоставляет большой набор методов, предназначенных для работы с диалоговым окном, включая следующие:

  • DoModal - используется для создания модального диалогового окна.
  • NextDlgCtrl - перемещает фокус на следующий элемент управления диалогового окна (а с последнего элемента управления - на первый).
  • PrevDlgCtrl - перемещает фокус на предыдущий элемент управления диалогового окна (а с первого элемента управления - на последний);
  • GotoDlgCtrl (CWnd* pWndCtrl ) - перемещает фокус на указываемый параметром pWndCtrl элемент управления (чтобы получить значение параметра pWndCtrl, можно вызвать метод CWnd::GetDlgItem).
  • SetDefID (UINT nID) - изменяет командную кнопку, используемую по умолчанию (параметр задает ID командной кнопки).
  • SetHelpID (UINT nIDR) - определяет контекстно-зависимый идентификатор справки (ID) для диалогового окна.
  • EndDialog - используется для закрытия модального диалогового окна.
  • OnInitDialog - вызывается для обработки сообщения WM_INITDIALOG, которое инициируется при выполнении методов Create, CreateIndirect или DoModal. При переопределении этого метода первоначально должен быть вызван метод OnInitDialog базового класса. При успешном завершении метод возвращает значение TRUE.
  • OnSetFont (CFont* pFont) - определяет шрифт, используемый по умолчанию для всех элементов управления диалогового окна.
  • OnOK - обработчик сообщения, вызываемый при щелчке пользователя на командной кнопке OK (с идентификатором IDOK ).
  • OnCancel - обработчик сообщения, вызываемый при щелчке пользователя на командной кнопке Cancel (с идентификатором IDCANCEL ).
< Лекция 18 || Лекция 19: 1234 || Лекция 20 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);