Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Урок 30. Архитектура Документ-Вид. Первая программа / Уроки MFC / Visual C++
Visual C++. MFC Урок 30. Архитектура Документ-Вид. Первая программа
В этом уроке мы с вами создадим первую программу на основе архитектуры Документ-Вид. Для этого нам понадобятся три класса - класс Вида (это будет потомок класса MFC CView), класс Документа (потомок CDocument) и класс окна-рамки (потомок CFrameWnd). После создания всех трех классов мы объединим их в методе InitInstance класса приложения.
Начинаем писать код. Создайте новый пустой проект типа Win32 Application. Не забудьте подсоединить библиотеку MFC (см. урок 2). Далее создайте меню. Его идентификатор можете оставить без изменений (IDR_MENU1) - сейчас это не важно. Подсоедините меню к нашему проекту (если забыли, то см. урок 14). Далее начинаем собственно писать код.
Пишем в окне кода три класса (Документа, Вида и окна-рамки):
Как вы видите, в этих классах ничего особенно интересного нет - в каждом есть конструктор (пустой). Кроме того в классе Вида мы добавляем виртуальную функцию OnDraw (с пустым телом).
Обратите также внимание на макросы DECLARE_DYNCREATE(...) и IMPLEMENT_DYNCREATE(..., ...). Мы их пишем для каждого класса. Они нужны для возможности создания объектов класса динамически во время выполнения программы. В частности, их надо вставить, если мы используем макрос RUNTIME_CLASS (а его мы будем использовать далее в этом уроке). Макрос DECLARE_DYNCREATE(...) берет в качестве параметра имя класса и помещается внутри него, макрос IMPLEMENT_DYNCREATE(..., ...) имеет два параметра - имя класса и его родителя и помещается в месте реализации класса (обычно в файле *.h, но мы весь код поместили в один файл).
Пишем код дальше. Добавляем еще один класс - потомок класса CWinApp и создаем его экземпляр (этот класс надо вставить после остальных):
class CMyApp: public CWinApp{
public:
virtual BOOL InitInstance();
};
CMyApp theApp;
В этом классе нам надо написать реализацию виртуального метода InitInstance(). Для этого вставьте следующий код:
Давайте обсудим этот код (он самый существенный в этом уроке).
В строке
...
CSingleDocTemplate *pDocTemplate;
...
мы создаем указатель на класс CSingleDocTemplate. Этот класс преднаначен для создания шаблонов документа (не путать с шаблонами языка C++ - это разные вещи). Документы эти принадлежат к SDI-приложениям (для MDI-приложений используется класс CMultiDocTemplate). Далее в строчках
мы создаем конкретный экземпляр нашего класса. Для его создании мы должны в качестве параметров указать имена трех классов (класса документа, класса вида и класса окна-рамки) и, кроме того, мы должны указать идентификатор для ресурсов программы (IDR_MENU1 в нашем случае, хотя это может быть не только меню).
Далее в строке
...
AddDocTemplate(pDocTemplate);
...
мы вызываем метод AddDocTemplate класса CWinApp для добавления созданного шаблона документа в нашем классе приложения.
В следующийх строчках
...
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
...
мы извлекаем параметры командной строки (хотя у нашей программы таких параметров просто нет). Если не удается обработать параметры командной строки, то мы просто выходим.