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

Взаимодействие документов и обликов

Логически облики привязаны к документу. У классов CDocument и CView есть механизмы для поддержания этой связи. Класс CDocument инкапсулирует список, хранящий все облики данного документа. С помощью методов этого класса облик добавляется и удаляется из списка, осуществляется просмотр списка и получение обликов.

Метод класса CView позволяет облику получить документ, за которым он закреплен:

CDocument* GetDocument() const;

Этот метод очень важен: без него облик не получит доступ к методам документа. Он возвращает константный указатель на документ, за которым закреплен облик. Если облик не закреплен ни за каким документом, возвращается NULL.

Допустим, документ имеет несколько обликов, один из которых изменяет документ. Тогда остальные облики должны синхронизировать свое отображение с измененным содержанием этого документа. Такую синхронизацию обеспечивает метод UpdateAllViews класса CDocument.

Классы объектов-обликов должны быть устроены так, чтобы при получении сообщения Update обрабатывающий их метод производил синхронизацию облика с документом. Обычно это означает синхронизацию данных облика и синхронизацию изображения в окне облика. Простейший вариант такой синхронизации дает метод OnUpdate класса CView. Он состоит в отправке объектом сообщения OnDraw самому себе. Если программист не предусмотрел своего метода обработки сообщения Update, то при получении этого сообщения облик выполняет метод OnUpdate базового класса CView.


Глава 8. Приложение с однодокументным интерфейсом (использование AppWizard)

  • Ресурсы приложения
  • Классы приложения
    • Главный класс приложения
    • Класс документа
    • Класс окна просмотра документа
    • Класс главного окна приложения

Рассмотрим проект однооконного приложение single, созданного с использованием средств MFC AppWizard. Пусть при его создании задавались следующие характеристики: приложение с однодокументным интерфейсом (SDI-приложение); возможность печати и предварительного просмотра документа; наличие панели управления (tool bar) и панели состояния (status bar); приложение не поддерживает ни технологию OLE, ни базу данных, ни сетевые технологии.

В состав проекта single входят следующие основные файлы (см. Приложение 2):

single.h - в этом файле перечислены другие включаемые файлы и описан главный класс приложения CSingleApp.

single.cpp - основной файл приложения. В нем определены методы основного класса приложения CSingleApp.

MainFrm.h - содержит описание класса окна-рамки (frame), который называется CMainFrame. Класс CMainFrame наследуется от базового класса CFrameWnd, определенного в библиотеке классов MFC.

MainFrm.cpp -файл содержит определение методов класса CMainFrame.

singleDoc.h - содержит описание класса документов приложения CSingleDoc.

singleDoc.cpp - включает определение методов класса CSingleDoc.

singleView.h - содержит описание класса окна просмотра приложения CSingleView.

singleView.cpp - включает определение методов класса CSingleView.

single.rc - файл ресурсов. В этом файле описаны все ресурсы приложения. Сами ресурсы приложения могут быть записаны в каталоге Res, расположенном в главном каталоге проекта.

resource.h - файл содержит определения идентификаторов ресурсов приложения.

res\single.ico - пиктограмма приложения.

res\single.rc2 - в этом файле определены ресурсы, которые нельзя редактировать с помощью редактора ресурсов среды Visual C++.

res\toolbar.bmp - файл содержит изображение кнопок панели управления toolbar.

StdAfx.h, StdAfx.cpp - использование этих файлов позволяет ускорить процесс повторного построения проекта.

readme.txt - текстовый файл, содержащий описание проекта. В нем кратко рассмотрен каждый файл, входящий в проект, перечислены классы приложения, а также представлена другая информация.

После построения проекта single и запуска полученного приложения на экране появляется главное окно приложения. Оно имеет меню, панели управления и состояния.

Некоторые из строк меню приложения уже работают. Например, когда выбирается из меню File строка Open, на экране появляется диалоговая панель для выбора файла. Можно выбрать любой файл и открыть его. Однако от этого изменится только заголовок окна приложения - в нем появится название открытого файла. Содержимое файла будет недоступно. Чтобы просматривать и изменять содержимое открытого файла, необходимо добавить специальный код. Решение этой проблемы будет рассматриваться далее.

Ресурсы приложения

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

Шаблон меню. В ресурсах приложения определен только один шаблон меню, имеющий идентификатор IDR_MAINFRAME.

Когда пользователь выбирает пункт меню, операционная система передает командное сообщение главному окну приложения. Большая часть строк меню IDR_MAINFRAME имеет стандартные идентификаторы, описанные в библиотеке MFC. Некоторые из команд, соответствующих этим идентификаторам, полностью обрабатываются MFC.

Панель управления toolbar. Многие современные приложения, в том числе все приложения, имеющие оконный интерфейс и созданные с использованием средств MFC AppWizard, имеют панель управления. Эта панель располагается, как правило, ниже меню главного окна приложения и содержит ряд кнопок.

Идентификаторы кнопок панели управления соответствуют идентификаторам некоторых строк меню приложения. Поэтому эти строки дублируют соответствующие строки меню.

Образ кнопок панели управления расположен в файле toolbar.bmp, записанном в подкаталоге res каталога проекта. Файл же описания ресурсов приложения single.rc включает себя соответствующий ресурс.

Пиктограмма. В файле ресурсов приложения single определена пиктограмма, представляющая минимизированное приложение. Точно такая же пиктограмма используется всеми приложениями, построенными на основе MFC AppWizard, вне зависимости от типа их интерфейса с пользователем.

Таблица текстовых строк. Одним из самых объемных ресурсов приложения является таблица текстовых строк. В ней определены названия главного окна приложения, строки, отображаемые в панели состояния, и т.д.

Ресурсы приложения содержат несколько блоков, описывающих таблицы текстовых строк. Рассмотрим их. Первый блок текстовых строк включает только одну текстовую строку, имеющую идентификатор IDR_MAINFRAME. В этой строке закодирована различная информация, относящаяся к типу документов приложения. Обычно для каждого типа документа приложения определена своя строка описания. Формирование этой строки выполняется MFC AppWizard на основании указанной при создании приложения информации.

Второй блок таблицы текстовых строк содержит строки с идентификаторами AFX_IDS_APP_TITLE и AFX_IDS_IDLEMESSAGE. Строка, имеющая идентификатор AFX_IDS_IDLEMESSAGE, отображается в панели состояния, когда приложение находится в ожидании.

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

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

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

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

Последний большой блок текстовых строк содержит краткие описания каждой строки меню системного приложения. Идентификаторы этих строк соответствуют идентификаторам строк меню, которые они описывают:

Диалоговая панель. В ресурсах приложения определена только одна диалоговая панель с идентификатором IDD_ABOUTBOX. Она содержит краткую информацию о приложении и отображается на экране, когда пользователь выбирает из меню Help строку About:

Таблица акселераторов. Для того, чтобы ускорить доступ к строкам меню приложения, MFC AppWizard добавляет в файл ресурсов таблицу акселераторов. Когда пользователь нажимает комбинацию клавиш, представленную в таблице акселераторов, приложению поступает командное сообщение с соответствующим идентификатором.

Замечание. При внимательном изучении ресурсов приложения можно заметить, что 4 типа ресурса приложения имеют элементы с одинаковыми идентификаторами. Существует меню, строковый ресурс, таблица акселераторов и пиктограмма, которые имеют один и тот же идентификатор IDR_MAINFRAME.

Классы приложения

Тексты приложения single (см. Приложение 2), созданные MFC AppWizard подробно рассматриваться не будут, вместо этого будет дано описание отдельных классов, определенных в приложении, и их связь друг с другом.

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

Класс приложения Базовый класс Описание
CsingleApp CwinApp Главный класс приложения
CmainFrame CframeWnd Класс главного окна приложения
CsingleDoc Cdocument Класс документа приложения
CsingleView CView Класс окна просмотра документа

Кроме этих основных классов создается класс CAboutDlg, наследованный от базового класса CDialog, который отвечает за диалоговую панель About.

Если при создании приложения определить возможность работы с базами данных или использование технологии OLE, то список классов приложения может стать шире.

Главный класс приложения

Главный класс приложения CSingleApp наследуется от базового класса CWinApp, а его определение и реализация находятся в файлах single.h и single.cpp.

Таблица сообщений класса. В последней строке определения класса CSingleDoc расположена макрокоманда DECLARE_MESSAGE_MAP(). Эта макрокоманда определена в файле afxwin.h, она добавляет к классу несколько элементов.

Так как в классе CSingleApp определена эта макрокоманда, то он может обрабатывать сообщения и имеет таблицу сообщений. Эта таблица расположена в файле single.cpp.

Кроме команды для обработки командного сообщения ID_APP_ABOUT, расположенного в блоке AFX_MSG_MAP, таблица содержит еще 3 макрокоманды, предназначенные для обработки командных сообщений с идентификаторами ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_PRINT_SETUP. Эти команды поступают, когда пользователь выбирает из меню приложения строки с соответствующими идентификаторами. Для обработки этих командных сообщений вызываются методы класса CWinApp.

Главный объект приложения. В приложении создается всего один объект класса CSingleApp. Этот объект определяется как глобальный, поэтому его конструктор получает управление сразу же после запуска приложения:

Конструктор класса. Конструктор класса CSingleApp никаких действий не выполняет и состоит из пустого блока:

Можно в конструкторе класса разместить код для инициализации приложения, однако лучше для этого использовать метод InitInstance.

Метод InitInstance. Этот метод является виртуальным методом класса CWinApp. Когда наследуется главный класс приложения от базового класса CWinApp, этот метод необходимо переопределить.

MFC AppWizard переопределяет метод InitInstance автоматически для приложений с любым пользовательским интерфейсом. Однако реализация этого метода может различаться для приложений с различным типом интерфейса.

После вызова метода Enable3dControls, который позволяет использовать в приложении трехмерные элементы управления, вызывается метод LoadStdProfileSettings. Этот метод загружает файл конфигурации приложения, имеющий расширение.ini. В ini-файле записаны имена нескольких файлов, с которыми работало приложение. Эти имена файлов будут добавлены как отдельные строки в меню File приложения. Кроме того, в ini-файле может храниться и другая информация.

Затем начинается создание шаблона документа. Сначала создается указатель на объект соответствующего класса. Для однооконных приложений это класс CSingleDocTemplate, а для многооконных - CMultiDocTemplate. Новый объект класса создается при помощи оператора new.

Конструктору класса CSingleDocTemplate передается 4 параметра. Первый параметр - nIDResource - определяет идентификатор ресурсов, используемых совместно с типом документов, управляемых шаблоном. К таким ресурсам относятся меню, пиктограмма, строковый ресурс, таблица акселераторов.

Остальные три параметра - pDocClass, pFrameClass, pViewClass - содержат указатели на объекты класса CRuntimeClass, полученные с помощью макрокоманд RUNTIME_CLASS из классов документа CSingleDoc, окна CMainFrame и окна просмотра CSingleView. Таким образом, шаблон документа объединяет всю информацию, относящуюся к данному типу документов.

Созданный шаблон документов заносится в список шаблонов, с которыми работает приложение. Для этого указатель на созданный шаблон документа передается методу AddDocTemplate из класса CWinApp. Указатель на шаблон документов передается через параметр pTemplate. Указатель pTemplate указывает на объекты класса CDocTemplate. Однако через него можно передавать указатели на объекты класса CSingleDocTemplate, так как класс CDocTemplate является базовым классом для CSingleDocTemplate.

Если разрабатывается приложение, основанное на однооконном или многооконном интерфейсе, то объект главного класса приложения управляет одним или несколькими объектами класса шаблона документа. Они, в свою очередь, управляют созданием документов. Один шаблон используется для всех документов данного типа. Так как однооконные приложения, как правило, работают только с документами одного типа, они используют только один шаблон документа.

После добавления шаблона документа обрабатывается командная строка приложения. Для этого создается объект cmdInfo класса CCommandLineInfo. Этот объект передается методу ParseCommandLine класса CWinApp. Он заполняет объект cmdInfo данными, взятыми из командной строки приложения.

Подготовленный объект передается методу ProccessShellCommand класса CWinApp для обработки. После успешной обработки командной строки этот метод возвращает ненулевое значение.

После успешной инициализации приложения и обработки командной строки метод InitInstance возвращает TRUE. Начинается обработка цикла сообщений.

Метод OnAppAbout. Кроме конструктора и метода IninInstance в главном классе приложения CSingleApp определен метод OnAppAbout. Он расположен в блоке AFX_MSG. Поэтому для работы с этим методом можно использовать ClassWizard.

Этот метод вызывается для обработки командного сообщения ID_APP_ABOUT. Это сообщение поступает в очередь приложения, когда пользователь выбирает из меню Help строку About. Он создает объект класса CAboutDlg, представляющий модальную диалоговую панель, и отображает ее на экране. Описание класса CAboutDlg, а также определение его методов содержится в файле single.cpp.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: