На этом шаге мы перечислим основные объекты, применяемые в архитектуре "документ/вид".
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 содержит ресурсы, переведенные на немецкий). Если не сделать этого, некоторые элементы пользовательского интерфейса в ваших приложениях сохранят язык операционной системы. //////////////////////////////////////////////////////////////
На следующем шаге мы рассмотрим средства, позволяющие выводить данные на монитор и принтер.