Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 152

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 146 147 148 149 150 151 < 152 > 153 154 155 156 157 158 .. 173 >> Следующая

шзшшшшт
What compound document support would you like to include?
<~ Ncfie <• Container <~ Mini-server . f full-server
<~~ Both container and server
r
I- Active document container Would you like support for compound files?
<• Yes. please
<~ Mo. thank you What other support would you like to include? '',
f~ Automation
l~ ActiveX Controls!
.< Back
Next >
Finish
Cancel
Рис. 24.6. Диалоговое окно мастера Арр\Мгагё для генерации программы СопЮегтю
Рассмотрим основные изменения, внесенные мастером AppWizard в обычный текст программы, что, собственно, и делает программу ContDemo контейнером OLE. Опишем работу программы и некоторые средства, добавляемые в полнофункциональное приложение-контейнер.
Класс приложения
Как и в приложении-сервере, мастер AppWizard добавляет вызов функции AfxOleinit в функцию Initlnstance класса приложения ContDemo, чтобы инициализировать библиотеки OLE:
//Инициализация библиотеки OLE if (!AfxOleinit())
t
AfxMessageBox(IDP_OLE_INIT_FAILED); ' '
return FALSE;
)
Мастер AppWizard добавляет вызов функции CSingleDocTemplate: :SetCon-tainerlnf о в функцию initinstance посте создания шаблона документа.
pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE);
Вызов функции SetContainerlnfo задает идентификатор меню, который вместе с соответствующим ресурсом акселератора отображается программой ContDemo при редактировании внедренного компонента "на месте". Вспомните: это меню объединено с меню, отображаемым программой-сервером при редактировании на месте. Как отмечалось ранее, функция SetContainerlnfo похожа на функцию SetServerlnf о, вызываемую для сервера.
Класс документа
Класс документа ContDemo порождается от MFC-класса COleDocument, а не от обычного класса CDocument. Класс COleDocument содержит основные средства обработки дтя управления документами в контейнере OLE или программах-серверах. Вспомните: класс документа сервера порождается от класса coleServerDoc порожденного от COleDocument.
Объект документа в контейнере OLE управляет сохранением внедренного компонента или компонентов, а также собственно данными документа (например, текстом в программе текстового процессора). Однако программа ContDemo сохраняет только внедренные компоненты, а не сами данные. Как показано в следующем параграфе, данные для каждого внедренного компонента сохраняются в объекте класса CContDemoCntrltem, наследуемого от COleClientltem и управляемого классом документа.
При использовании метода Serialize класса документа мастер AppWizard в конце добавляет вызов функции COleDocument: : Serialize для сериализации внедренных компонентов, сохраненных в документе. Функция Serialize вызывается для каждого объекта класса CContDemoCntrltem, сохраняющего внедренный компонент.
void CContDemoDoc::Serialize(CArchive& ar) {
if (ar.IsStoring ()) (
// TODO: здесь добавьте код сохранения
}
else
{
//TODO: здесь добавьте код загрузки
// Вызов базового класса COleDocument для сериализации // объектов класса COleClientltem документа контейнера COleDocument::Serialize(ar);
*
Класс компонента контейнера
Мастер AppWizard создает новый класс CContDemoCntrltem, порождаемый от MFC-класса COleClientitem и реализованный в файлах Cntrltem.h и Cntrltem.cpp. Когда новый компонент OLE внедряется в программу, класс представления, как описано в следующем параграфе, создает объект этого класса для хранения внедренного компонента и управления им. Каждый объект класса CContDemoCntrltem связан с объектом документа, поддерживающего список таких объектов.
Мастер AppWizard переопределяет виртуальные функции класса COleClientitem. Далее рассмотрены виртуальные функции, сгенерированные мастером AppWizard, и выполняющие несколько другие действия, чем функции базового класса.
Виртуальная функция CContDemoCntrltem: :OnChange получает управление, когда сервер изменяет компонент в режиме редактирования "на месте" или в режиме полного открытия. Версия этой функции, реализованная мастером AppWizard, вызывает версию этой же функции в базовом классе, а затем — функцию CDocument: :UpdateAllViews (см. гл. 13), после чего функция OnDraw класса представления перерисовывает компонент.
void CContDemoCntrltem::OnChange
(OLE_NOTIFICATION nCode, DWORD dwParam)
{
ASSERT_VALID(this) ;
COleClientitem::OnChange(nCode, dwParam);
// Когда компонент редактируется (на месте или в режиме // полного открытия), он передает сообщение функции // OnChange для изменения состояния компонента или // внешнего вида его содержимого
// TODO: сделайте компонент недействительным, // вызывая метод UpdateAllViews
// (с указаниями, требуемыми для вашего приложения) GetDocument()->UpdateAllViews(NULL);
// сейчас просто обновите все представления/без указаний
)
Когда внедренный компонент редактируется на месте, OLE вызывает виртуальную функцию CContDemoCntrltem::OnGetltemPosition, чтобы получить размер и позицию компонента. Функция возвращает эти значения в единицах устройства относительно области окна представления контейнера. Реализация этой функции, сгенерированная мастером AppWizard, возвращает постоянный размер:
Предыдущая << 1 .. 146 147 148 149 150 151 < 152 > 153 154 155 156 157 158 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100