Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 10569 / 333 | Оценка: 4.12 / 4.01 | Длительность: 19:18:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 20:

Библиотека классов MFC среды проектирования Visual Studio .NET. SDI и MDI приложения

< Лекция 19 || Лекция 20: 123 || Лекция 21 >
Аннотация: Вводится понятие архитектуры документ-отображение, рассматривается механизм управления документом. Изучаются классы отображений, классы шаблона документа и классы документа. Приводится пример SDI-приложения.
Ключевые слова: SDI, MDI, MFC, CSTRING, акселератор

Архитектура "документ-отображение"

Для реализации SDI и MDI-приложений посредством библиотеки классов MFC применяется механизм "документ/отображение". Это позволяет отображать один документ различными способами.

Документы и отображения

Архитектура "документ/отображение" (document/view) базируется на взаимодействии четырех основных классов.

  • Класс CDocument (или COleDocument ) реализует основные возможности внутреннего представления документа. Этот класс используется для управления данными (обычно документ представляет модуль данных, открываемых по команде Open и сохраняемых командой Save меню File).
  • Класс CView (или один из его наследуемых классов) отвечает за отображение содержания документа или любой графической информации. Объекты этого класса будем называть отображениями. Одному документу может быть сопоставлено несколько различных объектов отображений. При этом отображение пристыковывается или сопоставляется документу.

Отображение представляет вид документа на экране и является некоторой средой, взаимосвязывающей документ и пользователя. Объект "отображение" воспроизводит вид документа на экране и интерпретирует действия пользователя как операции над документом. Класс отображения также форматирует изображение как для печати, так и для предварительного просмотра.

  • Класс CFrameWnd (или другой класс Windows-окна, включая MDIFrameWnd и CMDIChildWnd ) представляют объекты, обеспечивающие окно-рамку (frame) вокруг одного или нескольких отображений документа.
  • Класс CDocTemplate (или классы CSingleDocTemplate, CMultiDocTemplate ) поддерживают объект шаблона документа, координирующий один или несколько существующих документов заданного типа, и управляют созданием документа, отображения и окна-рамки для этого типа.
Взаимосвязь объектов "документ ->отображение -> окно-рамка "

Рис. 20.1. Взаимосвязь объектов "документ ->отображение -> окно-рамка "

Объект "отображение" используется не только для представления документов на экране. Он же представляет документ и для печати, и для предварительного просмотра печатаемого документа.

С помощью механизма "документ-отображение" реализуется разделение данных, их экранное представление и обработка действий пользователя.

Операции по изменению данных реализуются классами документа. Объект отображение только вызывает этот интерфейс для доступа и обновления данных.

Документы, сопоставленные им отображения, окна-рамки создаются с использованием шаблона документа. Каждый шаблон документа используется для создания всех документов одного типа и управления ими.

Создание нового документа и сопоставленного ему отображения и окна-рамки. выполняется различными объектами: объектом "приложение", шаблоном документа, созданным документом и созданным окном-рамкой.

Следующая таблица иллюстрирует, какими объектами создаются шаблон документа, документ, окно-рамка и отображение.

Создающий объект Создаваемый объект
Приложение (Application object) Шаблон документа
Шаблон документа (Document template) Документ
Шаблон документа (Document template) Окно-рамка
Окно-рамка (Frame window) Отображение (View)

Все оконные MFC-приложения имеют как минимум два объекта: объект "приложение", производный от класса CWinApp, и объект "главное окно", производный от класса CWnd или его потомков - классов CFrameWnd, CMDIFrameWnd и CDialog.

Объект "документ" отвечает за внутреннее представление данных, показываемых объектом "отображение". Объект "отображение" предназначен для манипулирования данными объекта документа. Объект "отображение" состыковывается с объектом "документ" и окном-рамкой, образуя цепочку "документ->отображение->окно". Приложения, использующие SDI (Single Document Interface) или MDI (Multi Document Inter-face) интерфейс соответственно, называются SDI-приложением и MDI-приложением. Такие приложения относятся к приложениям с архитектурой "документ-отображение" (document/view).

Создание приложения с архитектурой "документ-отображение"

При создании приложения, использующего архитектуру "документ-отображение", как правило, должны быть выполнены следующие шаги:

  1. созданы ресурсы, используемые в шаблоне документа;
  2. реализован класс приложения (производный от CWinApp). Переопределен в этом классе метод InitInstance ;
  3. в методе InitInstance созданы шаблоны всех типов используемых документов и добавлены в список шаблонов. Класс CWinApp имеет переменную "член класса m_pDocManager", используемую для доступа к списку шаблонов;
  4. в методе InitInstance создан объект "окно-рамка" класса, наследуемого от класса CMDIFrameWnd или CMDIChildWnd, и данное окно отображено как главное окно приложения;
  5. в таблицу сообщений добавлены входы, которые описывают обработку сообщений, поступающих при открытии или сохранении файла;
  6. создан объект "приложение";
  7. реализован класс документа, производный от CDocument. Переопределены методы OnNewDocument и Serialize ;
  8. реализован класс окна-рамки, производный от CMDIFrameWnd или CMDIChildWnd ;
  9. реализован класс отображения, производный от CView или его потомков.
Управление документом

Для реализации управления данными документа первоначально необходимо выполнить следующие шаги:

  1. Для каждого типа документов объявить класс, производный от класса CDocument.
  2. Для хранения данных объявить переменные класса документа.
  3. Переопределить в производном классе документа метод Serialize класса CDocument. Метод Serialize реализует чтение и запись данных документа с диска.
  4. Для выполнения стандартных операций над документом следует дополнительно переопределить методы базового класса, такие как OnNewDocument, OnOpenDocument и DeleteContents.

Данные документа хранятся в переменных класса документа. Библиотека MFC содержит ряд классов, инкапсулирующих работу с различными наборами данных, включая следующие классы:

  • CString
  • CObList
  • CByteArray
  • CStringList
  • CMapWordToPrt

Для выполнения операций над элементами данных в класс документа добавляются требуемые методы.

При создании объекта "отображение" формируется указатель на документ, используемый отображением для доступа к объекту "документ" (его методам и переменным). Этот указатель может быть получен объектом отображения вызовом метода GetDocument класса CView. Отображение использует данные, хранимые в классе документа, для их отображения и изменения.

< Лекция 19 || Лекция 20: 123 || Лекция 21 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);

Руслан Апков
Руслан Апков
Молдова, Республика, Тирасполь, ПГУ им. Т.Г. Шевченко
Игорь Хан
Игорь Хан
Узбекистан, Ташкент, Ташкентский педагогический институт иностранных языков, 1990