На этом шаге мы перечислим основные объекты, применяемые в архитектуре "документ/вид".
AppWizard способен генерировать каркас приложения на основе архитектуры "документ/вид", который в дальнейшем можно изменить.
Этот каркас реализует документы и представления средствами классов, производных от CDocument и CView. Для работы приложения кроме них еще необходимы классы CWinApp, CFrameWnd и CDocTemplate.
В таблице 1 описаны все объекты и связанные с ними классы приложения на базе архитектуры "документ/вид".
| Объект | Класс и его назначение |
|---|---|
| Документ | Производный от CDocument. Определяет данные приложения |
| Вид (Представление) | Производный от CView. Служит для отображения данных и взаимодействия с пользователем |
| Окно-рамка | Производный от CFrameWnd. Представления отображаются внутри таких окон. В SDI-приложениях (однодокументных приложениях) являются главным окном |
| Шаблон документа | Производный от CDocTemplate. Управляет созданием документов, представлений и окон. Один класс шаблона документа отвечает за все открытые документы одного типа |
| Приложение | Производный от CWinApp. Управляет всеми объектами приложения и определяет его действия, в частности, инициализацию и очистку памяти |
Все объекты приложения на базе архитектуры "документ/вид" реагируют на действия пользователя совместно, будучи связаны между собой командами и сообщениями.
Дадим краткую характеристику некоторых из перечисленных объектов.
Шаблоны документа создаются и управляются объектом приложения. Одна из главных задач, выполняемая функцией InitInstance(), - создание одного или нескольких шаблонов документа соответствующего типа. В следующем примере показаны эти действия в SDI-приложении:
//Из CMyAppApp::InitInstance()
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyAppDoc),
RUNTIME_CLASS(CMainFrame), // главное окно SDI-приложения
RUNTIME_CLASS(CMyAppView));
AddDocTemplate(pDocTemplate);
При создании шаблон документа связывает класс документа с ресурсами (меню, значками и т. д.), окном-рамкой и представлением. Шаблон добавляется к приложению средствами функции CWinApp::AddDocTemplate().
В SDI-приложении пользователь просматривает документ и работает с ним с помощью представления, находящегося в главном окне, производном от CFrameWnd. На рисунке 1 показаны взаимосвязи объектов SDI-приложения.

Рис.1. Объекты SDI-приложения
MDI-приложение использует объект CMultiDocTemplate, которое хранит список открытых документов одного типа. Для создания главного окна в таких приложениях применяются классы, производные от CMDIFrameWnd. Представления же содержатся в дочерних oкнах, которые реализуются средствами класса CMDIChildWnd. Дочерник окна выглядят, как обычные окна-рамки, но располагаются не на рабочем столе, а внутри главного окна приложения. У них нет собственного меню, поэтому они используют меню главного окна, которое автоматически изменяется в зависимости от активного дочернего окна.
В следующем примере показано создание объекта CMultiDocTemplate:
//Из CMyAppApp::InitInstance()
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYMDITYPE,
RUNTIME_CLASS(CMyMDIAppDoc),
RUNTIME_CLASS(CChildFrame), // дочернее окно MDI-приложения
RUNTIME_CLASS(CMyMDIAppView));
AddDocTemplate(pDocTemplate);
Документ представлен в приложении классом, производным от CDocument. Он сохраняет и загружает данные, а также управляет ими. В нем есть функции для доступа к этим данным и работы с ними. Для взаимодействия между документами и представлениями каждый объект документа содержит список связанных с ним представлений, доступ к которым можно получить через функции CDocument::GetFirstViewPosition() и CDocument::GetNextView().
Класс CDocument содержит функцию UpdateAllViews(), которая передает всем связанным с документом представлениям уведомление о необходимости перерисовки окна (для этого она вызывает функцию CView::OnUpdate()).
Приложение должно обновлять представления при любом изменении данных, способном повлиять на их отображение.
Объект вида отвечает за работу с клиентской областью приложения. Он отображает информацию, содержащуюся в документе, и позволяет пользователю вводить данные. С документом разрешено связать несколько представлений, но представление может принадлежать только одному документу. Если мастеру AppWizard не указать специализированное представление, то представление в Вашем приложении будет основано на классе CView. Кроме него существуют еще классы CScrollView (с возможностью прокрутки окна), CListView и CTreeView (позволяют использовать для отображения данных элементы просмотра списка и дерева соответственно).
Фукнция GetDocument() из класса CView позволяет получить указатель, связанный с представлением объекта документа.
В заключение приведем перечень файлов, которые создаются AppWizard при создании SDI-приложения с именем Hello.
| Название файла | Назначение |
|---|---|
| Hello.clw | Файл ClassWizard |
| Hello.dsw | Основной файл рабочей области |
| Hello.h | Заголовочный файл приложения |
| Hello.cpp | Исходный текст приложения |
| StdAfx.h | Заголовочный файл для стандартного "каркаса" приложения |
| StdAfx.cpp | Исходный текст стандартного "каркаса" приложения |
| MainFrm.h | Заголовочный файл главного окна |
| MainFrm.cpp | Исходный текст главного окна |
| HelloDoc.h | Заголовочный файл документа |
| HelloDoc.cpp | Исходный текст документа |
| HelloView.h | Заголовочный файл вида |
| HelloView.cpp | Исходный текст вида |
| Resource.h | Файл с ресурсными константами |
| Hello.re | Файл с ресурсами |
| Hello.ncb | Файл с информацией о представлении и взаимных связях |
| Hello.dsp | Файл проекта |
| Res | Каталог для ресурсов. |
AppWizard также создает файл с именем ReadMe.txt, в котором более подробно разъясняется назначение некоторых файлов, созданных AppWizard:
===================================================== MICROSOFT FOUNDATION CLASS LIBRARY : Hello ===================================================== AppWizard создал приложение Hello за вас. Оно не только демонстрирует основные принципы использования классов Microsoft Foundation, но и является отправной точкой для написания вашего собственного приложения. В этом файле содержится краткое описание всех файлов, составляющих приложение Hello. hello.h - главный заголовочный файл приложения. Он включает другие заголовочные файлы проекта (в том числе Resource.h) и объявляет класс приложения CHelloApp. hello.cpp - главный файл с исходным текстом приложения, содержащий класс приложения CHelloApp. hello.rc - перечисление всех ресурсов Microsoft Windows, используемых в программе. В их число входят значки, растровые изображения и курсоры, все они хранятся в подкаталоге RES. Данный файл можно, редактировать непосредственно в Microsoft Developer Studio. res\hello.ico - файл с изображением, используемым в качестве значка приложения. Включается в главный ресурсный файл hello.гс. res\hello.гс2 - файл содержит ресурсы, не редактируемые в Microsoft Developer Studio. В него следует помещать все ресурсы, для которых отсутствуют специализированные редакторы. hello.сlw - файл содержит информацию, которая используется ClassWizard для модификации существующих или добавления новых классов. ClassWizard также пользуется им для хранения информации, необходимой для создания и модификации схем сообщений и схем данных в окнах диалогов, а также для создания прототипов функций ////////////////////////////////////////////////////////////// Главное обрамленное окно: MainFrm.h, MainFrm.cpp - файлы содержат класс обрамленного окна CMainFrame, производный от CFrameWnd и отвечающий за все аспекты работы с обрамленными окнами в интерфейсе SDI. res\Toolbar.bmp - растровый файл содержит изображения значков на панели инструментов. Исходная панель инструментов и строка состояния конструируются в классе CMainFrame. Измените файл вместе с массивом из файла MainFrm.cpp, чтобы добавить новые кнопки на панель инструментов. ////////////////////////////////////////////////////////////// AppWizard создает один тип документа и один вид: helloDoc.h, helloDoc.срр - документ. Файлы содержат класс CWelcomeDoc. Отредактируйте их, чтобы внести в документ специфические данные и реализовать сохранение/ загрузку файлов (через CHelloDoc: Serialize). helloView.h, helloView. cpp - вид документа. Файлы содержат класс CHelloView. Объекты CHelloView используются для просмотра объектов CHelloDoc. ////////////////////////////////////////////////////////////// Другие стандартные файлы: StdAfx.h, StdAfx.cpp - файлы используются для построения предварительно компилированных файлов - заголовочного (РСН) с именем hello.pen, а также файла типов StdAfx.obj. Resource.h - стандартный заголовочный файл, в котором определяются идентификаторы новых ресурсов. Microsoft Developer Studio читает этот файл и обновляет его содержимое. ////////////////////////////////////////////////////////////// Примечания : AppWizard помечает комментарием "TODO:" те части исходного текста, которые вам следует дополнить или изменить. Если ваше приложение использует MFC в виде совместной DLL-библиотеки и его язык отличается от текущего языка операционной системы, вам придется скопировать соответствующую библиотеку с локализованными ресурсами MFC40XXX.DLL с Visual C++ CD-ROM в каталог system или system32 и переименовать ее в MFCLOC.DLL. (Сокращение "XXX" определяет используемый язык. Например, MFC40DEU.DLL содержит ресурсы, переведенные на немецкий). Если не сделать этого, некоторые элементы пользовательского интерфейса в ваших приложениях сохранят язык операционной системы. //////////////////////////////////////////////////////////////
На следующем шаге мы рассмотрим средства, позволяющие выводить данные на монитор и принтер.