Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Усложненное взаимодействие «документ-вид»




 

Если Вы прорабатываете логику программы, поддерживающей множественное представление данных, взаимодействие должно быть сложнее, чем в предыдущем разделе. Основная проблема состоит в том, что пользователь редактирует данные в одном окне представления, а остальные окна представления надо обновлять, чтобы отразить внесенные изменения. Здесь понадобятся функции UpDateAllViews и OnUpdate, поскольку документ будет выступать в качестве координирующего центра при обновлении окон представления. При разработке придерживайтесь следующей схемы.

1. В заголовочном файле производного класса документа объявите переменные-члены документа. Если хотите, сделайте их закрытыми, а затем определите функции-члены для доступа к ним или объявите класс «вид» дружественным классу «документ».

2. В производном классе «вид» переопределите виртуальную функцию-член OnUpdate. Каркас приложений вызывает ее при любом изменении данных в документе. OnUpdate должна так изменить объект «вид», чтобы он отражал текущее содержимое документа.

3. Проанализируйте используемые Вами командные сообщения. Для каждого определите, относится оно к документу или к его представлению. (Пример команды, относящейся к документу, — Clear All в меню Edit.) Теперь сопоставьте команды соответствующим классам.

4. Предусмотрите обновление данных в документе соответствующими функциями-обработчиками командных сообщений в классе «вид». Убедитесь, что все они перед завершением обращаются к CDocument::UpdateAllViews. Для доступа к документу пользуйтесь версией функции-члена CView::GetDocument, обеспечивающей безопасное приведение типов.

5. Запрограммируйте обновление данных документа соответствующими функциями-обработчиками командных сообщений в классе документа. Убедитесь, что все они перед завершением тоже вызывают CDocument::UpdateAllViews.

Последовательность событий для сложного взаимодействия «документ-вид» показана ниже.

Запускается приложение Создается объект CMyDocument
  Создается объект CMyView
  Создаются другие объекты «вид»
  Создаются окна представлений
  Вызывается CMyView::OnCreate (если сопоставлена)
  Вызывается CDocument::OnNewDocument
  Вызывается CView::OnInitialUpdate, которая:
  вызывает CView::OnUpdate
  инициализирует объект «вид»
Пользователь выбирает команду, относящуюся к представлению данных CMyView-функции обновляют переменные-члены CMyDocument:
  вызывается функция CDocument::UpdateAllViews 
  вызываются функции OnUpdate для других объектов  «вид»
Пользователь выбирает команду, относящуюся к документу Функции CMyDocument обновляют переменные-члены:
  вызывается функция CDocument::UpdateAllViews 
  вызывается функция CMyView::OnUpdate 
  вызываются функции OnUpdate для других объектов  «вид»
Пользователь завершает работу с приложением Уничтожаются объекты «вид»
  Уничтожается объект CMyDocument

 

Функция CDocument::DeleteContents

 

В какой-то момент Вам понадобится функция, чтобы удалить содержимое документа. Вы могли бы написать свою закрытую функцию-член, но каркас приложений определил для этой цели виртуальную функцию DeleteContents в классе CDocument. Каркас приложений вызывает вашу переопределенную функцию DeleteContents при закрытии документа и, как Вы увидите далее, в ряде других случаев.



Класс «вид» библиотеки MFC (версия MVS 6.0)

В предыдущем разделе мы в самых общих чертах познакомились с архитектурой «документ-вид» библиотеки MFC б.О. В данном разделе Вы увидите, как создать приложение на базе функций этой библиотеки, не вдаваясь во все сложности иерархии классов и взаимосвязей объектов. Вы поработаете только с одним компонентом программы — классом «вид» (view class), тесно связанным с объектом «окно». Такие компоненты, как класс приложение (application class), «окно-рамка» (frame window) и «документ» можно пока игнорировать. Ваша программа, конечно, не сможет сохранять свои данные на диске и не будет поддерживать множественное представление информации — о том, как это сделать, и о многом другом Вы можете прочесть в части III [1].

Технические требования. Чтобы скомпилировать и запустить примеры программ, приведенные в этой и последующих главах, надо установить на компьютере Windows 95 или Microsoft Windows NT версии 4.0 (или выше), а также все компоненты Microsoft Visual C++ 6.0. Убедитесь, что каталоги с исполняемым файлом Developer Studio, библиотеками и включаемыми файлами указаны правильно. (Поменять эти каталоги можно при помощи команды Options из меню Tools.) Если у Вас возникнут трудности, обратитесь к документации Visual C++ и файлам README.

Поскольку в Windows-приложениях важную роль играют ресурсы, Вы будете использовать вкладку ResourceView рабочего пространства (решения в MVS-2005) для визуального просмотра ресурсов своей новой программы. Кроме того, мы дадим несколько советов по настройке среды Windows, чтобы скорость сборки программы была максимальной, а также по оптимизации вывода отладочной информации.

Что такое «вид»

С точки зрения пользователя, «вид» (view) – это обычное окно, которое можно изменять в размерах, перемещать и закрывать, как любые окна в приложениях Windows. С точки зрения программиста, «вид» — это объект С++ класса, производного от класса CView библиотеки MFC. Как и для любого объекта C++, поведение объекта «вид» определяется функциями-членами  (и переменными-членами) его класса, включая и специфичные для приложения функции из производного класса, и стандартные функции, унаследованные от базовых классов.

Используя Visual C++, Вы можете создавать достаточно интересные Windows-приложения, просто добавляя код в производный класс «вид», сгенерированный AppWizard. Во время работы вашей программы каркас приложения MFC создает объект производного класса «вид» и отображает на дисплее окно, тесно связанное с этим объектом. Как обычно при программировании на C++, код класса разделен между двумя исходными модулями — заголовочным файлом (.h) и файлом реализации (.cpp).

Интерфейсы SDI и MDI

Библиотека MFC поддерживает приложения двух разных типов: однодокументный интерфейс (Single Document Interface, SDI) и многодокументный интерфейс (Multiple Document Interface, MDI). С точки зрения пользователя, SDI — это приложение, состоящее из единственного окна. Если такое приложение работает с «документами» в дисковых файлах, то в каждый момент времени можно загрузить только один документ. Примером приложения SDI служит Windows Notepad (Блокнот). В  MDI-приложении имеется несколько дочерних окон (child windows), каждое из которых соответствует отдельному документу. Прекрасный пример такого приложения – Microsoft Word.

При запуске AppWizard для создания нового проекта параметр MDI выбран по умолчанию. На начальных стадиях освоения Visual C++ лучше создавать SDI-приложения, так как в них меньше классов и требуется учитывать меньше особенностей. Посему проверяйте, что Вы выбрали тип приложения Single Document (в первом диалоговом окне AppWizard). Архитектура каркаса приложения MFC позволяет легко преобразовывать большинство SDI-приложений в MDI-приложения.

Сценарий создания приложения DRW в ИС MVS 6.0

Мастер AppWizard генерирует код работающего приложения MFC, которое просто выводит на дисплей пустое окно с меню. Впоследствии Вы добавите к нему код, выполняющий отрисовку внутри окна. Далее приведены этапы создания приложения.

Шаг 1. Сгенерируйте приложение SDI с помощью AppWizard.

Из меню File в Visual C++ выберите New, затем щелкните в появившемся на экране диалоговом окне вкладку Projects, как показано ниже на рис.1.

 

Рис.1. Выбор мастера для создания каркаса приложения

 

Убедитесь, что в списке выделен элемент MFC AppWizard (exe), и затем введите в поле Location подходящий путь. В поле Project Name введите имя проекта DRW (или свое собственное) и щелкните ОК. Теперь Вам предстоит пройти через последовательность шагов AppWizard, первый из которых представлен на рис.2.

Убедитесь, что Вы выбрали Single Document. В следующих четырех диалоговых окнах оставьте все без изменений. Последнее диалоговое окно будет выглядеть как на рис. 3. Обратите внимание, что при генерации имен классов и исходных файлов за основу было принято название проекта DRW. Сейчас Вы можете, при желании, изменить названия. Щелкните кнопку Finish. Непосредственно перед генерацией кода AppWizard отображает диалоговое New Project Information (рис. 4), где представлена информация о новом проекте.

  

 

Рис. 2. Выбор типа приложения в окне мастера

 

 

Рис.3. Выбор имен файлов и базовых классов приложения

 

 

Рис. 4. Сводная информация о проекте

 

После того, как Вы щелкнули кнопку OK, AppWizard создает подкаталог приложения (…\DRW), а в нем ряд файлов. По окончании работы AppWizard посмотрите на содержимое каталога приложения. Интересны (на данный момент) файлы, представленные в табл.1.

Таблица 1

Файлы проекта DRW

Файл Описание
DRW.dsp Файл проекта, при помощи которого Visual будет выполнять сборку приложения
DRW.dsw Файл рабочего пространства, содержащего единственный проект DRW.dsp
DRW.rc Текстовый файл описаний ресурсов
DRWView.cpp Файл реализации класса «вид», в котором находятся функции-члены класса DRWView
DRWView.h Заголовочный файл класса «вид», содержащий объявление класса DRWView
DRW.opt Двоичный файл, в котором хранится информацию о том, какие файлы открыты для данного проекта и как расположены окна. (Файл не создается до тех пор, пока Вы не сохраните проект)
Readme.txt Текстовый файл, в котором описано назначение сгенерированных файлов
Resource.h Заголовочный файл, содержащий определения констант #define

 

Откройте файлы DRWView.cpp и DRWView.h и взгляните на исходный код. Вместе эти файлы определяют класс CDRWView — центральный в приложении. Объект класса CDRWView соответствует рабочему окну программы, где и происходят все «события».










Последнее изменение этой страницы: 2018-04-12; просмотров: 547.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...