Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft visual C++ и MFC.

© Александр Фролов, Григорий Фролов
Том 24, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

Приложение с единственным окном

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

Следующее приложение, которое мы будем рассматривать, немного сложнее. При запуске оно будет отображать на экране компьютера обычное окно, имеющее заголовок, системное меню и кнопки управления.

Точно так же как в приложении MFHello, в нашем втором приложении мы будем использовать класс CWinApp XE "CWinApp" в качестве главного класса приложения. Для управления окном приложения мы создадим еще один класс, наследуемый от базового класса CFrameWnd XE "CFrameWnd" , входящего в библиотеку MFС.

Создайте новый проект, как мы рассказывали выше, и назовите его именем MFStart. В качестве типа приложения выберите из списка Type строку Application (рис. 4.1 из главы “Приложение с главной диалоговой панелью”). Автоматизированные средства разработки приложений MFC AppWizard мы рассмотрим позже.

Наберите в редакторе исходный текст приложения и сохраните его в файле MFStart.cpp (листинг 2.2). Наш пример без учета строк комментариев состоит всего из двадцати строк исходного текста, поэтому набор текста не займет у вас много времени. Включите набранный файл в проект.

Листинг 2.2. Файл MFStart.cpp


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

//===================================================== 
// Класс CMFStartApp
// Наследуем от базового класса CWinApp главный
// класс приложения CMFStartApp
//===================================================== 
class CMFStartApp : public CWinApp
{
public:
	// Мы будем переопределять метод InitInstance,
	// предназначенный для инициализации приложения
	virtual BOOL InitInstance();
};
 
// Создаем объект приложение класса CMFStartApp
CMFStartApp MFStartApp;
 
//===================================================== 
// Класс CMFStartWindow
// Наследуем от базового класса CFrameWnd класс 
// CMFStartWindow. Он будет представлять главное 
// окно нашего приложения
//===================================================== 
class CMFStartWindow : public CFrameWnd
{
public:
	// Объявляем конструктор класса CMFStartWindow
	CMFStartWindow();
}; 

//===================================================== 
// Метод InitInstance класса CMFStartApp
// Переопределяем виртуальный метод InitInstance
// класса CWinApp. Он вызывается каждый раз при запуске 
// приложения
//===================================================== 
BOOL CMFStartApp::InitInstance()
{
	// Создаем объект класса CMFStartWindow
	m_pMainWnd = new CMFStartWindow();

	// Отображаем окно на экране. Параметр m_nCmdShow
	// определяет режим в котором оно будет отображаться
	m_pMainWnd -> ShowWindow(m_nCmdShow);

	// Обновляем содержимое окна
	m_pMainWnd -> UpdateWindow();
	return TRUE;
}

//===================================================== 
// Конструктор класса CMFStartWindow
//===================================================== 
CMFStartWindow::CMFStartWindow()
{ 
	// Создаем окно приложения, соответствующее 
	// данному объекту класса CMFStartWindow
	Create(NULL, "Hello MFC"); 
}

Просмотрите папку с файлами проекта. Теперь в ней расположен файл MFStart.cpp. Затем откройте страницу ClassView в окне Project Workspace (рис. 2.20). В ней отображаются два класса CMFStartApp и CMFStartWindow. В класс CMFStartApp входит метод InitInstance, а в класс CMFStartWindow конструктор CMFStartWindow. Кроме того, определена глобальная переменная MFStartApp.

Рис. 2.20. Классы проекта MFStart

Постройте проект и запустите полученное приложение, выбрав из меню Build строку Execute MFStart.exe. На экране появится главное окно приложения, представлене нами на рисунке 2.21. Оно имеет стандартный заголовок с надписью Hello MFC, системное меню и кнопки для изменения размера окна. Чтобы завершить приложение, вы можете выбрать строку Close из системного меню главного окна или нажать на кнопку .

Рис. 2.21. Приложение MFStart

Приложение MFStart очень простое. Оно состоит из одного главного окна и не содержит ни меню, ни каких либо других органов управления. Тем не менее, окно приложения MFStart обладает всеми возможностями окон Windows. Оно имеет заголовок, системное меню и кнопки управления. Вы можете изменить размер этого окна, увеличить его на весь экран и даже уменьшить до размера пиктограммы.

Так же как и у приложения MFHello, первая строка исходного текста приложения MFStart, не считая строки комментария, содержит директиву препроцессора #include, которая включает файл afxwin.h. Этот файл включается в исходные тексты всех приложений, использующих библиотеку классов MFC.

Затем мы определяем главный класс приложения, который наследуется от базового класса CWinApp XE "CWinApp" . Главный класс приложения MFHello, который называется CMFStartApp, определяется следующим образом:


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

Как видите главный класс приложения MFStart определяется точно так же как у приложения MFHello. Класс CMFStartApp наследуется от базового класса CWinApp. При этом базовый класс указан как public. Мы можем вызывать методы класса CWinApp для объектов класса CMFStartApp и обращаться к элементам данных класса CWinApp. В определении класса CMFStartApp объявлен виртуальный метод InitInstance XE "CWinApp:InitInstance" . Он будет переопределен нами несколько позже, после объявления класса окна приложения.

После объявления главного класса приложения мы создаем объект этого класса - MFStartApp:


 // Создаем объект приложение класса CMFStartApp
CMFStartApp MFStartApp;

Второй класс, определенный в нашем приложении, наследуется от базового класса CFrameWnd XE "CFrameWnd" как public и будет представлять главное окно приложения. В классе главного окна мы определили только конструктор, который будет описан ниже:


//===================================================== 
// Класс CMFStartWindow
// Наследуем от базового класса CFrameWnd класс 
// CMFStartWindow. Он будет представлять главное 
// окно нашего приложения
//===================================================== 
class CMFStartWindow : public CFrameWnd
{
public:
	// Объявляем конструктор класса CMFStartWindow
	CMFStartWindow();
}; 

Метод InitInstance главного класса приложения CMFStartApp служит для инициализации. Он вызывается автоматически каждый раз, когда запускается очередная копия приложения.

Мы используем метод InitInstance, чтобы отобразить на экране окно приложения. Для этого мы создаем объект класса CMFStartWindow и записываем указатель на этот объект в элемент данных m_pMainWnd XE "CWinThread:m_pMainWnd" класса CWinThread (класс CWinThread является базовым для класса CWinApp). Таким образом, объект приложения и объект окна приложения связываются вместе.

Для создания объекта класса CMFStartWindow мы используем оператор new. Он создает новый объект указанного класса, отводит память и возвращает указатель на него. При создании нового объекта оператором new для него автоматически вызывается конструктор, описанный ниже.

Окно появится на экране только после того, как будет вызван метод ShowWindow XE "CWnd:ShowWindow" . В качестве параметра методу ShowWindow передается параметр m_nCmdShow XE "CWinApp:m_nCmdShow" . Переменная m_nCmdShow является элементом класса CWinApp. Его назначение соответствует параметру nCmdShow функции WinMain, то есть определяет, как должно отображаться главное окно приложения сразу после его запуска.

После того как окно появилось на экране, мы передаем ему сообщение WM_PAINT XE "WM_PAINT" , вызывая метод UpdateWindow XE "CWnd:UpdateWindow" . По этому сообщению приложение должно обновить содержимое окна. В нашем первом приложении мы ничего не будем отображать в окне, поэтому данный метод можно не вызывать.

В конце метода InitInstance XE "CWinApp:InitInstance" мы вызываем оператор return и возвращаем значение TRUE, означающее, что инициализация приложения завершилась успешно и можно приступать к обработке очереди сообщений.

Если метод InitInstance вернет значение FALSE, приложение немедленно завершится. Мы использовали эту возможность в приложении MFHello, описанном выше.


//===================================================== 
// Метод InitInstance класса CMFStartApp
// Переопределяем виртуальный метод InitInstance
// класса CWinApp. Он вызывается каждый раз при запуске 
// приложения
//===================================================== 
BOOL CMFStartApp::InitInstance()
{
	// Создаем объект класса CMFStartWindow
	m_pMainWnd = new CMFStartWindow();

	// Отображаем окно на экране. Параметр m_nCmdShow
	// определяет режим в котором оно будет отображаться
	m_pMainWnd -> ShowWindow(m_nCmdShow);

	// Обновляем содержимое окна
	m_pMainWnd -> UpdateWindow();
	return TRUE;
}

Чтобы создать окно, мы создаем объект класса CMFStartWindow. Такой объект не является собственно окном, которое пользователь видит на экране компьютера, а представляет собой внутреннее представление окна. Для создания окна предназначается метод Create, определенный в классе CFrameWnd XE "CFrameWnd:Create" . Он создает окно и связывает его с объектом Си++, в нашем случае с объектом класса CMFStartWindow:


//===================================================== 
// Конструктор класса CMFStartWindow
//===================================================== 
CMFStartWindow::CMFStartWindow()
{ 
	// Создаем окно приложения, соответствующее 
	// данному объекту класса CMFStartWindow
	Create(NULL, "Hello MFC"); 
}

Для упрощения мы поместили описание классов, определения их методов и определения глобальных переменных в одном файле. На практике описания различных классов размещают в отдельных включаемых файлах. А определения методов записывают в программные файлы, имеющие расширение cpp.

Например, мы могли бы поместить описание классов CMFStartApp и CMFStartWindow в файлы MFStartApp.h и MFStartWindow.h. Метод InitInstance класса CMFStartApp и определение глобальной переменной MFStartApp можно поместить в файл MFStartApp.cpp, а определение конструктора класса CMFStartWindow - в файл MFStartWindow.cpp.

Так как в методе InitInstance класса CMFStartApp мы создаем новый объект класса CMFStartWindow, то мы должны включить в файл MFStartApp.cpp не только файл MFStartApp.h но еще и файл MFStartWindow.h. В проект MFStart мы должны записать оба программных файла MFStartApp.cpp и MFStartWindow.cpp. Листинги, представленные ниже содержат проект MFStart, разделенный на несколько файлов. Для того, чтобы сократить размер файлов, мы убрали из них комментарии.

Файл MFStartApp.h содержит описание главного класса приложения CMFStartApp. Этот файл представлен в листинге 2.3.

Листинг 2.3. Файл MFStartApp.h


#include <afxwin.h>
class CMFStartApp : public CWinApp
{
public:
	virtual BOOL InitInstance();
};

Виртуальный метод InitInstance переопределен нами в файле MFStartApp.cpp. В этом же файле создается объект класса CMFStartApp, представляющий само приложение. Файл MFStartApp.cpp показан в листинге 2.4.

Листинг 2.4. Файл MFStartApp.cpp


#include <afxwin.h>
#include "MFStartApp.h"
#include "MFStartWindow.h"

CMFStartApp MFStartApp;

BOOL CMFStartApp::InitInstance()
{
	m_pMainWnd = new CMFStartWindow();
	m_pMainWnd -> ShowWindow(m_nCmdShow);
	m_pMainWnd -> UpdateWindow();
	return TRUE;
}

Класс окна приложения CMFStartWindow определяется в файле MFStartWindow.h, представленном листингом 2.5. Мы наследуем класс CMFStartWindow от базового класса CFrameWnd.

Листинг 2.5. Файл MFStartWindow.h


#include <afxwin.h>

class CMFStartWindow : public CFrameWnd
{
public:
	CMFStartWindow();
}; 

И наконец, последний файл MFStartWindow.cpp модифицированного проекта MFStart показан в листинге 2.6. В этом файле определяется конструктор класса CMFStartWindow.

Листинг 2.6. Файл MFStartWindow.cpp


#include <afxwin.h>
#include "MFStartWindow.h"

CMFStartWindow::CMFStartWindow()
{ 
	Create(NULL, "Hello MFC"); 
}
[Назад] [Содеожание] [Дальше]