Класс окна просмотра документа

Следующим классом приложения single является класс окна просмотра документа CSingleView. Этот класс наследуется от базового класса CView библиотеки MFC. Определение и реализация этого класса находятся в файлах singleView.h и singleView.cpp.

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

Для этого определяется конструктор класса, не имеющий параметров, а в определении класса указывается макрокоманда DECLARE_DYNCREATE, а в файле реализации - макрокоманда IMPLEMENT_DYNCREATE.

Таблица сообщений класса. Непосредственно перед таблицей сообщений класса CSingleView (singleView.cpp) находится макрокоманда INPLEMENT_DYNCREATE. В таблице указываются обработчики сообщений от пунктов меню для печати ID_FILE_PRINT, ID_FILE_PRINT_DIRECT и ID_FILE_PRINT_PREVIEW.

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

Вместе с конструктором класса CSingleView MFC AppWizard определяет деструктор ~CSingleView. Сразу после создания проекта деструктор не выполняет никаких действий. В дальнейшем можно использовать его совместно с конструктором CSingleView.

Метод GetDocument. Этот метод возвращает указатель на документ, связанный с данным окном просмотра. Если окно просмотра не связано ни с каким документом, метод возвращает значение NULL.

Метод PreCreateWindow. Виртуальный метод PreCreateWindow определен в классе CWnd. Он вызывается непосредственно перед созданием окна, связанного с объектом класса. В качестве параметра этому методу передается структура типа CREATESTRUCT, определяющая характеристики создаваемого окна. Приложение может изменить данные, записанные в этой структуре, чтобы повлиять на внешний вид создаваемого окна.

Метод OnDraw. Это метод вызывается, когда надо отобразить документ в окне. В качестве параметра pDC методу OnDraw передается указатель на контекст устройства, используя который надо отобразить документ.

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

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

В том случае, если внешний вид документа при выводе на его печать должен отличаться от вывода в окно, можно вызвать метод IsPrinting контекста устройства, чтобы определить, для чего вызывается OnDraw. Метод IsPrinting возвращает не нулевое значение, если объект контекста, для которого он вызывается, является контекстом принтера. Если контекст представляет другое устройство отображения, например окно, то метод IsPrinting возвращает нуль.

В строке метода OnDraw MFC AppWizard вставляет строку, которая служит для получения указателя pDoc на документ, связанный с данным окном просмотра. Предполагается, что используя указатель pDoc, можно получить данные из документа и отобразить их на экране.

Методы OnPrepare, OnBeginPrinting и OnEndPrinting. Виртуальные методы OnPrepare, OnBeginPrinting и OnEndPrinting, определенные в классе CView, вызываются, если пользователь желает распечатать документ, отображенный в данном окне просмотра.

Метод OnPreparePrinting вызывается перед печатью документа. OnBeginPrinting используется для получения шрифтов и других ресурсов GDI. Метод OnEndPrinting используется для освобождения ресурсов, полученных методом OnBeginPainting.

Методы AssertValid и Dump. На время отладки приложения в состав класса CSingleView включаются переопределения виртуальных методов AssertValid и Dump. Эти методы определены в базовом классе CObject и используются при отладке приложения. При окончательном построении приложения эти методы не переопределяются.

Класс главного окна приложения

Класс CMainFrame представляет главное окно приложения. Внутри этого окна отображаются окно просмотра документа, а также панели управления и состояния. Определение и реализация класса CMainFrame расположены в файлах MainFrm.h и MainFrm.cpp.

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

Шаблон документов приложения создает объекты класса CMainFrame динамически. Для этого в определении класса указана макрокоманда DECLARE_DYNCREATE, объявлен конструктор, не имеющий параметров, а в файле реализации добавлена макрокоманда IMPLEMENT_DYNCREATE.

Таблица сообщений класса. Класс CMainFrame может получать и обрабатывать сообщения, поэтому в определении класса указана макрокоманда DECLARE_MESSAGE_MAP, а в файле реализации класса расположена таблица сообщений.

Сначала в таблице сообщений расположена единственная макрокоманда ON_WM_CREATE. Эта макрокоманда устанавливает для обработки сообщения WM_CREATE метод OnCreate. Сообщение WM_CREATE передается функции окна сразу после его создания, но до того, как окно появится на экране.

Конструктор и деструктор класса. MFC AppWizard определяет конструктор и деструктор класса CMainFrame. Можно расположить в конструкторе и деструкторе код для инициализации и деинициализации объектов класса.

Метод OnCreate. Это метод определяется в классе CWnd следующим образом. Параметр lpCreateStruct этой функции является указателем на объект CREATESTRUCT, содержащей характеристики создаваемого окна.

При нормальной работе метод OnCreate должен вернуть значение 0, чтобы продолжить создание окна. Если метод OnCreate возвращает -1, окно будет удалено (уничтожено).

MFC AppWizard переопределяет метод OnCreate в классе CMainFrame. Поэтому для обработки сообщения WM_CREATE будет вызван именно переопределенный метод OnCreate класса CMainFrame.

Основное назначение метода OnCreate заключается в том, что он сначала вызывает метод OnCreate базового класса CFrameWnd, а затем создает и отображает внутри главного окна панель управления toolbar и панель состояния status bar. Кстати, если из метода OnCreate удалить последние три вызова методов, то этим можно запретить перемещение панели управления.

Метод OnCreate базового класса CFrameWnd выполняет обработку сообщения WM_CREATE по умолчанию и возвращает нулевое значение, если обработка прошла без ошибок.

В случае возникновения ошибок при обработке сообщения в базовом классе возвращается -1. При этом метод CMainFrame::OnCreate прекращает дальнейшую обработку и возвращает -1, вызывая удаление окна.

Панель управления и панель состояния. Самая интересная задача, которую решает метод OnCreate, заключается в отображении панелей управления и состояния. Для панели управления и панели состояния в библиотеке классов MFC предусмотрены два класса CStatusBar и CToolBar.

Рассмотрим самые главные методы, необходимые для работы с панелями управления и состояния.

Панель управления. Класс CToolBar представляет панель управления toolbar. Обычно панель управления содержит несколько кнопок и разделителей между ними. Для панели управления определен специальный ресурс типа TOOLBAR (специальная диалоговая панель.

Чтобы создать панель управления toolbar, следует выполнить следующие действия:

  • Создать ресурс (специальную диалоговую панель), описывающий панель toolbar.
  • Создать объект класса CToolBar, представляющий панель управления.
  • Вызвать метод Create класса CToolBar, чтобы создать панель управления и связать ее с объектом, представляющим панель управления.
  • Вызвать метод LoadToolBar класса CToolBar. Он загрузит ресурс диалоговой панели и завершит построение панели управления.

MFC AppWizard создает для приложения панель управления, которую программист может видоизменить по желанию.

Объект для m_wndToolBar класса CToolBar для управления панелью определяется в классе CMainFrame. Этот объект объявлен как protected, поэтому обращаться к нему можно только из класса главного окна приложения CMainFrame.

protected: // control bar embedded members CToolBar m_wndToolBar;

Создание самой панели управления и отображение ее на экране происходит во время обработки метода OnCreate класса CMainFrame.

if (!m_wndToolBar.Create(this) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create }

В качестве родительского окна панели управления методу Create указано ключевое слово this. Таким образом, родительским окном является главное окно приложения, представленное объектом класса CMainFrame.

Если хотя бы один из методов, создающих и изображающих панель управления, завершится с ошибкой, то метод OnCreate класса CMainFrame возвращает -1 и дальнейшая обработка прекращается с одновременным удалением окна.

Панель состояния. Для управления панелью состояния используется класс CStatusBar. Чтобы создать для окна панель состояния следует выполнить следующие действия:

  • Создать объект класса CStatusBar. Он будет представлять панель состояния и управлять ей.
  • Вызвать метод Create класса CStatusBar, чтобы создать панель и связать ее с объектом, представляющим панель состояния.
  • Вызвать метод SetIndicators класса CStatusBar, чтобы связать каждый индикатор панели состояния с идентификатором текстовой строки.

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

Объект m_wndStatusBar класса CStatusBar определяется как элемент класса CMainFrame. Это вполне естественно, так как панель состояния принадлежит именно окну класса CMainFrame.

protected: // control bar embedded members CStatusBar m_wndStatusBar;

Создание панели состояния и отображение ее на экране выполняется во время обработки метода OnCreate класса CMainFrame сразу после создания панели управления.

Методы Create и SetIndicators, создающие панель, вызываются в одной строке.

if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE("Failed to create status bar\n"); return -1; // fail to create }

В качестве родительского окна панели состояния методу Create указано ключевое слово this. Таким образом, родительским окном панели состояния, так же как и панели управления, является главное окно приложения, представленное объектом класса CMainFrame.

Информация, которая должна отображаться в панели состояния, определяется идентификаторами, записанными в массиве. Каждый идентификатор представляет текстовую строку из таблицы ресурсов приложения. В приложении single массив indicators, описывающий панель состояния, определен в файле MainFrm.cpp. В этот массив и входят иденификаторы текстовых строк панели состояния.

Сразу после создания панели состояния вызывается метод SetIndicators. В первом параметре ему передается массив indicators, а во втором - количество элементов в этом массиве.

Метод SetIndicators отображает в панели состояния строки, идентификаторы которых представлены в массиве indicators. При этом первый элемент массива определяет крайнюю левую строку в панели состояния. По умолчанию, строки в панели состояния выравниваются по правой границе. Можно получить доступ к любому элементу панели состояния по его индексу или идентификатору.

Метод PreCreateWindow. Виртуальный метод PreCreateWindow определен в классе CWnd. Он вызывается непосредственно перед созданием окна, связанного с объектом класса. В качестве параметра этому методу передается структура типа CREATESTRUCT, определяющая характеристики создаваемого окна. Приложение может изменить данные, записанные в этой структуре, чтобы повлиять на внешний вид создаваемого окна.

Методы AssertValid и Dump. Когда выполняется построение отладочной версии приложения, в состав класса включается переопределения виртуальных методов AssertValid и Dump. Эти методы определены в базовом классе CObject и используются при отладке приложения.


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

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

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

Пусть при помощи AppWizard создан проект приложения multi с многооконным интерфейсом (без использования технологии OLE, сетевых технологий, баз данных). После построения проекта и запуска приложения на экране появиться главное окно. Внутри главного окна расположены меню, панель управления и панель состояния.

Сразу после запуска приложения открывается дочернее окно, предназначенное для просмотра документа, которое получает название Multi1. При помощи строк New и Open меню File можно создавать новые дочерние окна. Если одновременно открыто несколько окон, то можно упорядочить расположение этих окон и пиктограмм, представляющих минимизированные окна. Для этого предназначено меню Window.

Опишем основные файлы проекта multi (см. Приложение 3):

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

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

ChildFrm.cpp - в этом файле находится реализация методов класса CChildFrame дочернего окна MDI. Класс CChildFrame наследуется от базового класса CMDIChildWnd, определенного в библиотеке классов MFC.

ChildFrm.h -содержит определение методов класса CChildFrame.

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

multi.h - в этом файле описан главный класс приложения CMultiApp.

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

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

multiView.cpp - содержит определение методов класса CMultiView.

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

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

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

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

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

res\multidoc.ico - пиктограмма для документов приложения.

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

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

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

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

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

Шаблон меню. Для многооконного приложения multi в ресурсах проекта определены два метода с идентификаторами IDR_MAINFRAME и IDR_MULTITYPE. Приложение использует одно из этих меню в зависимости от того, открыт документ или нет.

Меню с идентификатором IDR_MAINFRAME используется, если в приложении не открыт ни один документ. Как видно из описания шаблона этого меню, его строки отличаются от строк меню однооконного приложения single.

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

В этом меню определенно выпадающее меню Window, строки которого служат для управления MDI-окнами приложения:

Пиктограмма. В файле ресурсов приложения multi определены две пиктограммы IDR_MAINFRAME и IDR_MULTITYPE. Каждая из этих пиктограмм содержит по два изображения размером 32х32 и 16х16 пикселов.

Пиктограмма IDR_MAINFRAME представляет приложение, когда оно минимизировано, Эта же пиктограмма отображается в верхнем левом углу окна приложения.

Пиктограмма IDR_MULTITYPE используется для представления документа, с которым работает приложение. В отличие от приложения с однооконным интерфейсом, которое не использует эту пиктограмму, приложение с многооконным интерфейсом отображает пиктограмму IDR_MULTITYPE в верхнем левом углу окна документа.

Панель управления toolbar. Несмотря на то что приложение имеет два меню, для него определена только одна панель управления.

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

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

Таблица акселераторов. Таблица акселераторов IDR_MAINFRAME приложения полностью соответствует таблице акселераторов, добавляемой MFC AppWizard к ресурсам приложения с однооконным интерфейсом.

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

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

Блок текстовых строк, описывающие тип документов приложения и основные характеристики главного окна приложения, и блок текстовых строк, которые используются в панели состояния statusbar, аналогичны для такого же блока из приложения single.

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

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

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

MFC AppWizard создает для приложения с многооконным приложением несколько основных классов:

Класс приложения Базовый класс Описание
CMultiApp CWinApp Главный класс приложения
CMainFrame CMDIFrameWnd Класс главного окна приложения
CChildFrame CMDIChildWnd Класс дочернего окна MDI
CMultiDoc CDocument Класс документа приложения
CMultiVeiw CView Класс окна просмотра документа

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

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

Главный класс приложения CMultiApp управляет работой всего приложения. Методы этого класса выполняют инициализацию приложения, обработку цикла сообщений и вызываются при завершении приложения.

В приложении определен только один объект главного класса приложения -theApp. Этот объект должен быть один вне зависимости от того, какой интерфейс имеет приложение - однооконный, многооконный или основанный на диалоговой панели.

Конструктор класса. Конструктор класса, созданный MFC AppWizard, не выполняет никаких действий. В нем можно разместить код для инициализации объекта CMultiApp:

Метод InitInstance. Основную часть работы по инициализации приложения выполняет метод InitInstance главного класса приложения. Этот метод отличается от метода InitInstance, который используется (переопределяется) для однооконных приложений.

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

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

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

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

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

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

После создания шаблона документа создается главное окно MDI (главное окно приложения). Для создания главного окна приложения формируется объект класса CMainFrame и записывается указатель на него в pMainFrame. Класс CMainFrame определен в приложении и будет рассматриваться ниже.

Затем для только что созданного объекта вызывается метод LoadFrame класса CFrameWnd. Он создает окно, загружает ресурсы, указанные параметром, и связывает их с объектом класса CMainFrame. Параметр метода LoadFrame определяет меню, пиктограмму, таблицу акселераторов и таблицу строк главного окна приложения.

Указатель на главное окно приложения, которым является главное окно MDI, записывается в элемент данных m_pMainWnd главного окна приложения. Этот элемент данных определен в классе CWinThread. Когда окно, представленное указателем m_pMainWnd, закрывается, приложение будет автоматически завершено.

Метод LoadFrame не отображает главного окна приложения на экране. Для этого нужно вызвать методы ShowWindow и UpdateWindow.

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

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

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

Таблица сообщений. Класс CMultiApp может получать сообщения и имеет таблицу сообщений. Таблица сообщений класса CMultiApp расположена в файле multi.cpp. Она содержит четыре макрокоманды для обработки командных сообщений от меню приложения.

Класс главного окна приложения

Внутри главного окна приложения отображаются панели управления и состояния, дочерние MDI-окна, используемые для просмотра документов. Для управления главным окном приложения используется класс CMainFrame, определенный в файле MainFrm.h.

Класс главного окна CMainFrame многооконного приложения практически полностью соответствует классу главного окна однооконного приложения. Однако следует обратить внимание, что класс CMainFrame наследуется от базового класса CMDIFrameWnd, а не от CFrameWnd, как это было для однооконного приложения.

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

Таблица сообщений класса. Таблица сообщений класса CMainFrame содержит только одну макрокоманду ON_WM_CREATE, которая устанавливает для обработки сообщения WM_CREATE метод OnCreate. Сообщение WM_CREATE приходит во время создания главного окна приложения.

Метод OnCreate. Основное назначение метода OnCreate заключается в том, что он сначала вызывает метод OnCreate базового класса CMDIFrameWnd, а затем создает и отображает внутри главного окна панель управления toolbar и панель состояния status bar. Этот процесс происходит так же, как и для однооконного приложения.

Метод PreCreateWindow. Виртуальный метод PreCreateWindow определен в классе CWnd. Он вызывается непосредственно перед созданием окна, связанного с объектом класса.

Методы AssertValid и Dump. В отладочной версии приложения класс CMainFrame содержит переопределения виртуальных методов AssertValid и Dump. Эти методы определены в базовом классе CObject и используются при отладке приложения.


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



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