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

       

Класс главного окна приложения


Класс CMainFrame представляет главное окно приложения. Внутри этого окна отображаются окно просмотра документа, а также панели управления и состояния. Определение и реализация класса CMainFrame расположены в файлах MainFrm.h и MainFrm.cpp.

Класс CMainFrame наследуется от базового класса CFrameWnd, определенного в библиотеке MFC. Как правило, перед программистом не возникает необходимости как-либо дорабатывать класс главного окна приложения, созданный MFC AppWizard.

Шаблон документов приложения создает объекты класса CMainFrame динамически. Для этого в определении класса указана макрокоманда DECLARE_DYNCREATE, объявлен конструктор, не имеющий параметров, а в файле реализации добавлена макрокоманда IMPLEMENT_DYNCREATE.

Таблица сообщений класса. Класс CMainFrame может получать и обрабатывать сообщения, поэтому в определении класса указана макрокоманда DECLARE_MESSAGE_MAP, а в файле реализации класса расположена таблица сообщений.

Сначала в таблице сообщений расположена единственная макрокоманда ON_WM_CREATE. Эта макрокоманда устанавливает для обработки сообщения WM_CREATE метод OnCreate. Сообщение WM_CREATE передается функции окна сразу после его создания, но до того, как окно появится на экране.

Конструктор и деструктор класса. MFC AppWizard определяет конструктор и деструктор класса CMainFrame. Можно расположить в конструкторе и деструкторе код для инициализации и деинициализации объектов класса.

Метод OnCreate. Это метод определяется в классе CWnd следующим образом. Параметр lpCreateStruct этой функции является указателем на объект CREATESTRUCT, содержащей характеристики создаваемого окна.

При нормальной работе метод OnCreate должен вернуть значение 0, чтобы продолжить создание окна. Если метод OnCreate возвращает -1, окно будет удалено (уничтожено).

MFC AppWizard переопределяет метод OnCreate в классе CMainFrame. Поэтому для обработки сообщения WM_CREATE будет вызван именно переопределенный метод OnCreate класса CMainFrame.

Основное назначение метода OnCreate заключается в том, что он сначала вызывает метод OnCreate базового класса CFrameWnd, а затем создает и отображает внутри главного окна панель управления toolbar и панель состояния status bar.
Кстати, если из метода OnCreate удалить последние три вызова методов, то этим можно запретить перемещение панели управления.



Метод OnCreate базового класса CFrameWnd выполняет обработку сообщения WM_CREATE по умолчанию и возвращает нулевое значение, если обработка прошла без ошибок.

В случае возникновения ошибок при обработке сообщения в базовом классе возвращается -1. При этом метод CMainFrame::OnCreate прекращает дальнейшую обработку и возвращает -1, вызывая удаление окна.



Панель управления и панель состояния.
Самая интересная задача, которую решает метод OnCreate, заключается в отображении панелей управления и состояния. Для панели управления и панели состояния в библиотеке классов MFC предусмотрены два класса CStatusBar и CToolBar.

Рассмотрим самые главные методы, необходимые для работы с панелями управления и состояния.



Панель управления.
Класс CToolBar представляет панель управления toolbar. Обычно панель управления содержит несколько кнопок и разделителей между ними. Для панели управления определен специальный ресурс типа TOOLBAR (специальная диалоговая панель.

Чтобы создать панель управления toolbar, следует выполнить следующие действия:

  • Создать ресурс (специальную диалоговую панель), описывающий панель toolbar.


  • Создать объект класса CToolBar, представляющий панель управления.


  • Вызвать метод Create класса CToolBar, чтобы создать панель управления и связать ее с объектом, представляющим панель управления.


  • Вызвать метод LoadToolBar класса CToolBar. Он загрузит ресурс диалоговой панели и завершит построение панели управления.


  • MFC AppWizard создает для приложения панель управления, которую программист может видоизменить по желанию.

    Объект для m_wndToolBar класса CToolBar для управления панелью определяется в классе CMainFrame. Этот объект объявлен как protected, поэтому обращаться к нему можно только из класса главного окна приложения CMainFrame.

    protected: // control bar embedded members CToolBar m_wndToolBar;

    Создание самой панели управления и отображение ее на экране происходит во время обработки метода OnCreate класса CMainFrame.



    if (!m_wndToolBar.Create(this) !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create }

    В качестве родительского окна панели управления методу Create указано ключевое слово this. Таким образом, родительским окном является главное окно приложения, представленное объектом класса CMainFrame.

    Если хотя бы один из методов, создающих и изображающих панель управления, завершится с ошибкой, то метод OnCreate класса CMainFrame возвращает -1 и дальнейшая обработка прекращается с одновременным удалением окна.



    Панель состояния.
    Для управления панелью состояния используется класс CStatusBar. Чтобы создать для окна панель состояния следует выполнить следующие действия:

  • Создать объект класса CStatusBar. Он будет представлять панель состояния и управлять ей.


  • Вызвать метод Create класса CStatusBar, чтобы создать панель и связать ее с объектом, представляющим панель состояния.


  • Вызвать метод SetIndicators класса CStatusBar, чтобы связать каждый индикатор панели состояния с идентификатором текстовой строки.


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

    Объект m_wndStatusBar класса CStatusBar определяется как элемент класса CMainFrame. Это вполне естественно, так как панель состояния принадлежит именно окну класса CMainFrame.

    protected: // control bar embedded members CStatusBar m_wndStatusBar;

    Создание панели состояния и отображение ее на экране выполняется во время обработки метода OnCreate класса CMainFrame сразу после создания панели управления.

    Методы Create и SetIndicators, создающие панель, вызываются в одной строке.

    if (!m_wndStatusBar.Create(this) !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE("Failed to create status bar\n"); return -1; // fail to create }

    В качестве родительского окна панели состояния методу Create указано ключевое слово this. Таким образом, родительским окном панели состояния, так же как и панели управления, является главное окно приложения, представленное объектом класса CMainFrame.



    Информация, которая должна отображаться в панели состояния, определяется идентификаторами, записанными в массиве. Каждый идентификатор представляет текстовую строку из таблицы ресурсов приложения. В приложении single массив indicators, описывающий панель состояния, определен в файле MainFrm.cpp. В этот массив и входят иденификаторы текстовых строк панели состояния.

    Сразу после создания панели состояния вызывается метод SetIndicators. В первом параметре ему передается массив indicators, а во втором - количество элементов в этом массиве.

    Метод SetIndicators отображает в панели состояния строки, идентификаторы которых представлены в массиве indicators. При этом первый элемент массива определяет крайнюю левую строку в панели состояния. По умолчанию, строки в панели состояния выравниваются по правой границе. Можно получить доступ к любому элементу панели состояния по его индексу или идентификатору.



    Метод PreCreateWindow.
    Виртуальный метод PreCreateWindow определен в классе CWnd. Он вызывается непосредственно перед созданием окна, связанного с объектом класса. В качестве параметра этому методу передается структура типа CREATESTRUCT, определяющая характеристики создаваемого окна. Приложение может изменить данные, записанные в этой структуре, чтобы повлиять на внешний вид создаваемого окна.



    Методы AssertValid и Dump.
    Когда выполняется построение отладочной версии приложения, в состав класса включается переопределения виртуальных методов AssertValid и Dump. Эти методы определены в базовом классе CObject и используются при отладке приложения.


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