3 Простое приложение (Лекции по курсу ПОУК-1)
Описание файла
Файл "3 Простое приложение" внутри архива находится в папке "Лекции по курсу ПОУК-1". Документ из архива "Лекции по курсу ПОУК-1", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.
Онлайн просмотр документа "3 Простое приложение"
Текст из документа "3 Простое приложение"
12 стр. Лекция 3. Простейшие MFC - приложения
Простейшие MFC-приложения
Самые простые приложения с использованием библиотеки классов MFC можно создавать в Microsoft Developer Studio без применения автоматизированных средств разработки приложений MFC AppWizard. Необходимо только создать проект типа Win32 Application и включить в его установки поддержку библиотеки 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, приложение продолжит свою работу и приступит к обработке очереди сообщений.
Приложение с главным окном
Приложение first не имело главного окна. Для вывода сообщения на экран использовалась функция AfxMessageBox, которая очень похожа на функцию MessageBox программного интерфейса Windows.
Рассмотрим другое приложение- приложение start, оно несколько сложнее предыдущего. При запуске оно отображает на экране компьютера обычное окно, имеющее заголовок, системное меню и кнопки управления.
Точно так же, как и в приложении first, во втором приложении используется класс CWinApp в качестве главного класса приложения. Для управления окном приложения создается еще один класс CMainWindow, наследуемый от базового класса CFrameWnd, входящего в библиотеку MFC.
Файл start.h
#include <afxwin.h>
class CStartApp: public CWinApp
{
public:
virtual BOOL InitInstance();
};
Файл startm.h
#include <afxwin.h>
// Класс CMainWindow - представляет главное окно приложения.
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
};
Файл start.cpp
#include <afxwin.h>
#include "start.h"
#include "startm.h"
BOOL CStartApp::InitInstance()
{
// Создание объекта класса CMainWindow
m_pMainWnd= new CMainWindow();
// Отображение окна на экране.
// Параметр m_nCmdShow определяет режим отображения окна.
m_pMainWnd->ShowWindow(m_nCmdShow);
// Обновление содержимого окна.
m_pMainWnd->UpdateWindow();
return TRUE;
}
CStartApp theApp;
Файл startm.cpp
#include <afxwin.h>
#include "startm.h"
// Конструктор класса CMainWindow
CMainWindow::CMainWindow()
{
// Создание окна приложения
Create(NULL,"Hello");
}
Приложение start очень простое - оно состоит из одного главного окна и не содержит ни меню, ни каких-либо других органов управления. И тем не менее главное окно приложения обладает всеми возможностями Windows-окон. Оно имеет заголовок, системное меню и кнопки управления. Можно изменить размер этого окна, увеличить его на весь экран и уменьшить до размера пиктограммы.
В исходных текстах определяется главный класс CStartApp приложения, который наследуется от базового класса CWinApp. При этом базовый класс указан как public. Можно вызывать методы класса CWinApp для объектов класса CStartApp и обращаться к элементам данных класса CWinApp.
В определении класса CStartApp объявлен виртуальный метод InitInstance. Он переопределяется в файле реализации класса. После объявления главного класса приложения и переопределения функции InitInstance Метод InitInstance главного класса приложения CStartApp служит для инициализации. Он вызывается автоматически каждый раз, когда запускается очередная копия приложения.
Второй класс, класс CMainWindow, наследуется от базового класса CFrameWnd как public и представляет главное окно приложения. В классе главного окна определяется только конструктор.
В данном приложении метод InitInstance используется для отображения на экране окна приложения. Для этого создается объект класса CMainWindow и записывается указатель на этот объект в элемент данных m_pMainWnd класса CWinThread (этот класс является базовым для класса CWinApp). Таким образом, объект приложения и объект окна приложения связываются вместе.
Для создания объекта класса CMainWindow используется оператор new. Он создает объект указанного класса, отводит память и возвращает указатель на него. При создании нового объекта класса окна оператором new для автоматически вызывается конструктор.
Само окно появится на экране только после того, как будет вызван метод ShowWindow. В качестве параметра методу ShowWindow передается значение m_nCmdShow. Переменная m_nCmdShow является элементом класса CWinApp. Его назначение соответствует параметру функции WinMain, который определяет, как должно отображаться главное окно приложения сразу после его запуска.
После появления окна на экране ему передается сообщение WM_PAINT при помощи вызова метода UpdateWindow. По этому сообщению приложение должно обновить содержимое окна.
В конце метода InitInstance вызывается оператор return и возвращается значение TRUE, означающее, что инициализация приложения завершилась успешно и можно приступать к обработке очереди сообщений (eсли метод InitInstance вернет значение FALSE, приложение немедленно завершится; эта возможность использовалась в приложении first).
Для создания окна приложения создается объект класса CMainWindow. Такой объект - это не окно, которое пользователь видит на экране компьютера. Этот объект является внутренним представлением окна. Для создания окна предназначается метод Create, определенный в классе CFrameWnd. Он создает окно и связывает его с объектом C++, в случае приложения start - с объектом класса CMainWindow. Метод Create вызывается в конструкторе класса CMainWindow.
Обработка окном сообщений
Работа операционной системы Windows основана на обработке сообщений. Когда пользователь работает с устройствами ввода/вывода (например, клавиатурой или мышью), драйверы этих устройств создают сообщения, описывающие его действия.