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

       

Приложение без главного окна


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

Файл first.cpp #include <afxwin.h> // Включаемый файл для MFC

// Класс CFirstApp - главный класс приложения. // Наследуется от базового класса CWinApp. class CFirstApp:public CWinApp { public: // Переопределение метода InitInstance, // предназначенного для инициализациии приложения. virtual BOOL InitInstance(); };

// Создание объекта приложения класса CFirstApp. CFirstApp theApp;

// Метод InitInstance // Переопределение виртуального метода InitInstance класса CWinApp. // Он вызывается каждый раз при запуске приложения. BOOL CFirstApp::InitInstance() { AfxMessageBox("First MFC-application"); return FALSE; }

В этом приложении определен только один класс - CFirstApp, наследованный от базового класса CWinApp. В класс CFirstApp входит метод InitInstance. Кроме того, определена одна глобальная переменная - theApp.

Для использования в приложении классов или функций библиотеки MFC необходимо включить эту библиотеку в проект приложения. Программные коды библиотеки классов MFC могут использоваться приложением двумя разными способами. Код библиотеки MFC либо непосредственно записывается в выполняемый файл приложения, либо вызывается по мере необходимости из отдельной dll-библиотеки.

Использование для приложения DLL-библиотеки немного ускоряет процесс построения проекта и позволяет создавать выполняемые файлы значительно меньшего размера. Однако сам по себе такой выполняемый файл работать не будет. Для него необходима dll-библиотека. Поэтому, если приложение будет устанавливаться и на других компьютерах, его надо распространять вместе с dll-библиотекой.

Замечание. Если для создания нового приложения используется MFC AppWizard, библиотека MFC подключается автоматически.
Программисту не нужно вручную вносить изменения в проектный файл в этом случае.

Рассмотрим, как работает приложение first на уровне исходного текста. Сначала в текст приложения включается файл afxwin.h. В этом файле определены классы, методы, константы и другие структуры для библиотеки классов MFC. Кроме того, включаемый файл afxwin автоматически подключает другой файл - windows.h, необходимый для вызовов функций стандартного программного интерфейса Windows.

Сравним исходный текст приложения first с аналогичным приложением, созданным без использования библиотеки классов MFC. В этом приложении присутствует главная функция приложения WinMain, которая вызывается, когда пользователь или операционная система запускает приложение:

#include <windows.h> int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // Отображение диалоговой панели. MessageBox(NULL,"First MFC-application","Message",MB_OK); // Завершение работы приложения return 0; }

Если посмотреть на текст программы first, то там нет хорошо знакомой функции WinMain. Не видно также переменных, представляющих параметры этой функции.

В приложениях, основанных на классах MFC, функция WinMain скрыта от программиста в определении класса CWinApp. В каждом приложении определяется главный класс приложения, наследуемый от базового класса CWinApp. Приложение должно иметь только один объект главного класса приложения, наследованного от класса CWinApp.



Класс CWinApp выполняет все действия, которые обычно выполняет функция WinMain, - инициализирует приложение, обрабатывает сообщения и завершает приложение. Для этого класс CWinApp включает виртуальные методы InitApplication, InitInstance, Run и ExitInstance.

Чтобы выполнить инициализацию приложения, функция WinMain вызывает методы InitApplication и InitInstance для объекта главного класса приложения. Метод InitApplication выполняет инициализацию на уровне приложения. Программист может переопределить этот метод в своем приложении.


Метод InitInstance выполняет инициализацию каждой копии приложения. Обычно этот метод создает главное окно приложения. Программист должен обязательно переопределить этот метод в своем приложении. Остальные методы, например Run, можно не переопределять.

Затем функция WinMain начинает обрабатывать цикл сообщений. Для этого вызывается метод Run. Можно переопределить этот метод, чтобы реализовать собственный цикл обработки сообщений.

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

В случае приложения first главный класс приложения CFirstApp наследуется от базового класса CWinApp. При этом базовый класс указан как public. Это означает, что в программе доступны все элементы базового класса CWinApp, объявленные как public. Можно вызывать методы класса CWinApp для объектов класса CFirstApp и обращаться к элементам данных класса CWinApp.

В объявлении класса CFirstApp объявлен виртуальный метод InitInstance. Этот метод переопределяется в приложении. Изначально метод InitInstance определен в классе CWinApp. Он отвечает за инициализацию приложения. Он вызывается каждый раз, когда пользователь запускает приложение. Если пользователь запустит приложение несколько раз, то метод InitInstance будет вызываться каждый раз.



Метод InitInstance обязательно должен быть переопределен в главном классе приложения. Остальные виртуальные методы можно оставить без изменения.



Сразу после объявления главного класса приложения создается объект theApp этого класса. Объект главного класса приложения должен быть определен как глобальный. В этом случае он будет создан сразу при запуске приложения и сможет управлять всей работой приложения. После создания глобального объекта вызывается функция WinMain, определенная в классе CWinApp. Она выполняет свои обычные функции - регистрирует классы окон, создает окно и т.д.



Нельзя создавать два или более объекта класса, наследованного от базового класса CWinApp.


Каждое приложение должно иметь один и только один объект главного класса приложения.



Метод InitInstance главного класса приложения CFirstApp служит для инициализации. Он вызывается автоматически всякий раз, когда запускается очередная копия приложения. В приложении first метод InitInstance используется для вывода на экран диалоговой панели при помощи функции AfxMessageBox, определенной в MFC.

Вместо функции AfxMessageBox можно воспользоваться функцией MessageBox программного интерфейса Windows. Когда из приложения, созданного с использованием классов MFC, вызываются функции программного интерфейса Windows, необходимо указывать перед именем функции символы ::. Например, вызов функции MessageBox будет выглядеть следующим образом:

::MessageBox(NULL,"First MFC-application","Message",MB_OK);

В конце метода InitInstance вызывается оператор return и возвращается значение FALSE. Приложение сразу же завершается. Если метод InitInsatnce вернет значение TRUE, приложение продолжит свою работу и приступит к обработке очереди сообщений.


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