Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 1000 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 9:

Однодокументный интерфейс MFC

Аннотация: Применение концепции Документ/Вид. Классы массивов MFC. Создание заготовки SDI-приложения. Конструирование класса документа и представления. Сохранение и загрузка рисунков.Реконструкция приложения для добавления цвета и толщины линий. Изменение ресурса меню. Панели инструментов и строка состояния MFC. Реализация управления видимостью. Редактирование файла ресурсов проекта вручную. Добавление текстовых строк будущего комбинированного списка. Создание комбинированного списка на панели инструментов. Строка состояния. Анализ кода создания строки состояния, сгенерированного мастером. Добавление индикатора цвета в строку состояния. Связывание индикатора с обработчиком.
Файлы к данной лабораторной работе, Вы можете скачать здесь.

Цель работы

  1. Ознакомиться с архитектурой "Документ/Вид", используемой для создания однодокументных и многодокументных приложений
  2. Научиться создавать каркасы однодокументных приложений
  3. Научиться отделять данные от их представления
  4. Научиться инкапсулировать данные в собственные классы C++
  5. Научиться организовывать взаимодействие данных и меню
  6. Посадить все опции меню одной и той же категории на один комбинированный обработчик с распознаванием нажатой опции
  7. Создать собственную панель инструментов.
  8. Научиться присоединять панель инструментов к рамке приложения
  9. Отображать и скрывать панель инструментов с помощью элемента меню
  10. Помещать поле со списком на панель инструментов
  11. Отображать описание элементов панели инструментов в строке состояния
  12. Добавлять собственные элементы строки состояния

Применение концепции Документ/Вид

В основе приложений MFC лежит концепция document object/view window (Документ/Вид). Обычно документ представляет собой отдельный файл, который приложение способно открыть. В нем хранятся данные, управляемые приложением. Отображение данных и интерфейс работы с ними обеспечивает представление. Представление способно отображать данные документа частично и в разной форме, выполняя заданный срез документа.

Отношение между документом и представлением строится по принципу "один ко многим". То есть один документ (одно содержание) может иметь несколько представлений (несколько форм), но каждое из этих представлений отображает одни и те же данные.

Программно такая концепция реализуется механизмом SDI (Single Document Interface) - однодокументный интерфейс. Управление документом осуществляется объектом на основе производного класса от базового класса CDocument, а управление интерфейсами - на основе базового класса CView.

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


В приложениях SDI, созданных мастером MFC Application Wizard, исходный код реализации фреймового окна (реализация класса CMainFrame ) размещается в файлах проекта MainFrm.h и MainFrm.cpp. Класс CMainFrame наследует практически все свои функциональные возможности от базового класса CFrameWnd.

В свою очередь, фреймовым окном управляет каркас приложения, порожденный классом CWinApp. Каркас приложения не имеет визуального представления, его задача - обеспечить взаимодействие окна-рамки и дочерних фреймовых окон. Это взаимодействие осуществляется с помощью сообщений. Модель отношений между базовыми классами приложения SDI приведена на рисунке


Класс CDocument обеспечивает стандартное поведение объектов документа MFC -приложения. Независимо от того, создается однодокументное приложение или многодокументное, мастер AppWizard создает только один класс документа, производный от базового класса CDocument.

Классы массивов MFC

В библиотеке MFC существует несколько классов массивов для хранения различных типов данных. У всех этих классов одинаковые функциональные возможности и работают они по одному и тому же принципу. Основное различие - это тип хранимых в них данных.

Классы массивов MFC
Класс Описание
CArray Шаблонный класс для создания пользовательских классов массивов
CByteArray Массив с данными типа байт
CDWordArray Массив с данными типа DWORD (двойное слово)
CObArray Массив может содержать классы, производные от класса CObject
CPtArray Массив указателей на любые объекты и типы данных
CStringArray Массив объектов типа CString
CUIntArray Массив данных типа UINT (unsigned int)
CWordArray Массив данных типа WORD (слово)
Методы классов массивов MFC
Класс Описание
array[int index] Оператор ображения к значению элемента массива по его индексу. Индексация массива начинается с нуля.
array.GetAt(int index) Возвращает элемент массива по его индексу. Индексация массива начинается с нуля.
array.SetAt(int index, element) Записывает элемент массива по его индексу. Тип данных записываемого элемента должен соответствовать типу данных всего массива. Вызов функции не приводит к росту количества элементов массива.
array.InsertAt(int index, element) Вставляет новый элемент перед элементом index. Размерность массива увеличивается на единицу.
array.Add(element) Добавляет новый элемент в конец массива. Добавляемый элемент должен иметь тип данных всего массива.
array.RemoveAt(int index, int count=1) Удаляет count элементов, начиная с позиции index. Если второй аргумент не указан, то удаляется один элемент.
array.RemoveAll() Удаляет все элементы массива и присваивает свойству количества элементов массива значение ноль.
В массивах классов CObArray и CPtArray элементы как объекты не удалаются. Из массивов удаляются только указатели на объекты. При использовании функций RemoveAt() и RemoveAll() необходимо сначала удалить сами объекты, а затем удалить из массива их указатели.
array.GetSize() Возвращает количество элементов массива.
array.GetCount() Возвращает количество элементов массива.
array.GetUpperBound() Возвращает индекс последнего элемента массива.
array.SetSize(int iNewSize, iGrowBy) Управляет размером массива.
array.Copy(source) Копирует source в array
array.Append(source) Присоединяет source в конец array
В случае с массивами классов CObArray и CPtArray функции Copy() и Append() копируют в массив указатели, а не сами объекты. В результате, изменение значения объекта в одном из массивов приведет к изменению значения соответствующего объекта в другом массиве. Кроме того, при удалении элемента в одном из массивов указатель в другом массиве станет недействительным.

Создание заготовки SDI-приложения

Создадим графическое приложение на основе однодокументного интерфейса, в котором можно будет рисовать, и сохранять нарисованное в файле с последующим восстановлением.

  • Войдите в свой каталог выполнения лабораторных работ
  • Создайте новый проект MFC Application и назовите его DrawSDI
  • Настройте мастер приложений строго в соответствии с таблицей
    Таблица настройки мастера создания заготовки приложения
    Свойство проекта Значение
    Вкладка Application Type
    Application Type: Single document
    Document/View architecture support Включено
    Resource language: Английский (США)
    Project style: MFC standard
    Use of MFC: Use MFC in a static library
    Вкладка Compound Document Support
    Compound document support: None
    Вкладка Document Template Strings
    File extension: dhc
    Вкладка Database Support
    Database support: None
    Вкладка User Interface Features
    Main frame styles: Minimize box
    Maximize box System menu Initial status bar
    Toolbars: Standard docking
    Вкладка Advanced Features
    Все оставить по умолчанию
    Вкладка Generated Classes
    Base class: CView
    Все остальное Оставить по умолчанию

После настройки вкладки мастера должны иметь такой вид








Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .