|
http://tikitak.narod.ru ---- Главная страница сайта
ШАГ 1 - Минимальный проект.
Создадим проект. Здесь все просто - выберем Win32 Application, а AppWizard пока отложим. Если Вы раньше программировали на OWL(я так и делал) или вообще не программировали под Windows(так я тоже делал), результаты работы этого шамана приведут в уныние даже настоящего мужчину. Все работает, но как ?
Добавим в проект наш файл.
И настроим проект так, чтобы он использовал MFC.
Вот здесь и вот так. Не забудем проверить поддержку MFC для всех типов (Setting For).
В нашем файле запишем код.
#include <afxwin.h> // MFC Основные и стандартные компоненты
class CMainWnd : public CFrameWnd
{
public:
CMainWnd(); // Конструктор по умочанию
};
CMainWnd::CMainWnd()
{
Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,rectDefault,
NULL,NULL); // Создать окно программы
}
class CMyApp : public CWinApp
{
public:
CMyApp(); // конструктор по умолчанию
virtual BOOL InitInstance(); // стандартная инициализация
};
CMyApp::CMyApp() // конструктор главного класса приложения
{}
BOOL CMyApp::InitInstance() // стандартная инициализация
{ m_pMainWnd=new CMainWnd();
ASSERT(m_pMainWnd);
m_pMainWnd->ShowWindow(SW_SHOW); // Показать окно
m_pMainWnd->UpdateWindow(); // Обновить окно
return TRUE; // Вернуть что все нормально
};
CMyApp theApp; // запуск приложения
Теперь попробуем во всем этом разобраться:
Первая строка включает необходимый файл заголовка с описанием классов, функций и переменных, он ссылается ещё на кучу других, а они на другие и так до windows.h. Вот почему windows.h нам и не понадобился.
В каждой программе на С++ есть главная функция программы в Dos это main() в Windows - WinMain(). Эта функция обеспечивает запуск программы. Она проверяет операционную среду, выполняет некоторые настройки и, если все нормально, непосредсвенно передает управление вашему коду. Но у нас то её нет !.
В MFC есть класс CWinApp, который и включает главную функцию программы. Естественно, что в приложении она может быть только одна.
Мы с вами создали CMyApp, как производный от CWinApp и унаследовали все его свойства, методы и т.д. В своем классе мы объявили конструктор по умолчанию (без параметров). Он необходим, иначе вы не скомпилируете программу. Здесь все логично мы в коде объявляем статический класс производный от нашего CMyApp в строке CMyApp theApp;. Как видите он тоже без параметров.
CWinApp имеет виртуальный метод InitInstance. Виртуальный он потому, что это только заглушка. Мы с вами написали свой метод в виде функции. Этот метод должен возвращать ненулевое значение, если инициализация прошла нормально, а иначе 0. Он предназначен, чтобы вы могли описать класс окна программы и отобразить окно на экране.
Дальше мы должны знать, что в CWinApp есть указатель на класс окна - m_pMainWnd. Этот указатель общедоступный и вы могли догадаться, так как он нигде не объявлен. Ситуация с ним такая - Если по окончанию InitInstance он будет равен нулю, то приложение завершится. И естественно когда приложение завершается он обнуляется.
Строкой
m_pMainWnd=new CMainWnd();
мы присваеваем этому указателю адрес класса CMainWnd, который порожден от CFrameWnd. Последний из них отвечает за работу окна программы в стиле одного документа (SDI single document interface). Он создает окно, управляет сообщениями и т.д. В конструкторе этого класса мы вызвали функцию создания окна, в которой указали кучу параметров.
Первый параметр указывает на класс Windows, он нам не нужен, пока не нужен и поэтому NULL, дальше указали имя окна программы, WS_OVERLAPPEDWINDOW указывает, что окно имеет заголовок и рамку, rectDefault говорит о том, что размер окна присвоит Windows, и еще некоторые параметры, ими всеми мы займемся позже.
Далее следует
ASSERT(m_pMainWnd);
Очень хорошая и простая функция. Если создание объекта произойдет, то m_pMainWnd будет отличаться от нуля и всё будет нормально, а иначе вы получите сообщение о том, что в таком файле на такой строке ошибка. Вообщем это намного лучше, чем смотреть дизассемблированный код или оказаться в исходном коде библиотеки MFC, если не повесим Windows конечно.
Так как m_pMaiWnd это сейчас тоже что и CMainWnd, то мы и используем это переменную, чтобы вывести на экран окно
m_pMainWnd ->ShowWindow(SW_SHOW);
и показать окно
m_pMainWnd->UpdateWindow();
Вот и все !
Шпаргалка
- Включить описание классов MFC
#include <afxwin.h>
- Объявить класс производный от CWinApp
class CMyApp : public CWinApp
.......
- Объявить переменную этого класса
CMyApp theApp;
- Объявить класс производный от CFrameWnd
class CMainWnd : public CFrameWnd
.........
- В конструкторе класса производного от CFrameWnd вызвать функцию Create и выбрать параметры в ней на свой вкус.
Create(NULL,"Step1",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);
- Переопределить функцию InitInstance класса производного от CWinApp
- С функции InitInstance создать объект производный от CFrameWnd и присвоить указателю m_pMainWnd адрес этого объекта.
m_pMainWnd=new CMainWnd();
- Проверить указатель на корректность
ASSERT(m_pMainWnd);
- Вызвать функции класса производного от CFrameWnd для прорисовки на экране
m_pMainWnd ->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
- Закончить выполнение функции, убедив MFC, что все нормально
return TRUE;
- Откомпилировать, собрать и запустить программу, насладившись пустым окном и именем Step1.
Следующий Шаг | Оглавление
By Artem.
Используются технологии uCoz
|