В конце метода 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. Он создает окно и связывает его с объектом Си++, в нашем случае с объектом класса 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.
#include <afxwin.h>
class CMFStartApp : public CWinApp {
public:
virtual BOOL InitInstance();
};
Виртуальный метод InitInstance переопределен нами в файле MFStartApp.cpp. В этом же файле создается объект класса CMFStartApp, представляющий само приложение. Файл MFStartApp.cpp показан в листинге 2.4.
#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.
#include <afxwin.h>
class CMFStartWindow : public CFrameWnd {
public:
CMFStartWindow();
};
И наконец, последний файл MFStartWindow.cpp модифицированного проекта MFStart показан в листинге 2.6. В этом файле определяется конструктор класса CMFStartWindow.
#include <afxwin.h>
#include 'MFStartWindow.h'
CMFStartWindow::CMFStartWindow() {
Create(NULL, 'Hello MFC');
}
Обработка сообщений