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

 

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

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

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

void CContDemoCntrltem::OnGetltemPosition(CrectS rPosition) {
ASSERT_VALID(this);
// При активизации на месте вызывается функция
// CContDemoCntrltem::OnGetltemPosition, чтобы определить
// размещение компонента. Стандартная реализация, созданная
// мастером AppWizard, просто возвращает закодированный // прямоугольник, отражающий текущее положение компонента // относительно окна представления. Также для этого можно // вызвать функцию ContDemoCntrltem::GetActiveView
// TODO: возвратите правильный прямоугольник // (в пикселях) в rPosition
rPosition.SetRect(10, 10, 210,210);
i /
Программа-контейнер должна реализовать функцию OnGetltemPosition, поскольку ее версия в базовом классе ничего не выполняет.
Наконец, функция OnDeactivateUI вызывается, когда пользователь программы ContDemo, нажимая клавишу Esc, выводит внедренный компонент из активного состояния. Реализация функции, сгенерированная мастером AppWizard, вызывает версию этой функции из базового класса, а затем — функцию COleClientltem: :Deactivate для деактивации внедренного компонента и освобождения используемых им ресурсов.
void CContDemoCntrltem::OnDeactivateUI(BOOL bUndoable) {
COleClientltem::OnDeactivateUI(bUndoable);
// Скрыть объект, если он не является внедренным внешним объектом DWORD dwMisc = 0;
m_lpObject->GetMiscStatus(GetDrawAspect(), SdwMisc); if (dwMisc & OLEMISC_INSIDEOUT) DoVerb(OLEIVERB_HIDE, NULL);
}
Класс представления
Мастер AppWizard изменяет класс представления контейнера OLE. Сначала он объявляет новую переменную класса представления m_pSelection:
CContDemoCntrltem* m_pSelection;
Переменная mpSelection инициализируется значением null в функции CContDemoView: : OnlnitialUpdate. Когда пользователь внедряет компонент OLE, этой переменной передается адрес объекта класса CContDemoCntrltem, управляющего новым компонентом описанной ниже функции CContDemoView: :OnlnsertObject. Так, в программе ContDemo переменная m_pSelection всегда содержит указатель на последний внедренный компонент или значение NULL, если указатель отсутствует. В полной программе-контейнере переменная mpSelection обычно используется как указатель на текущий выбранный компонент, в противном случае (если указатель отсутствует) ей присваивается значение NULL.
Функция CContDemoView: :OnDraw, созданная мастером AppWizard, отображает последний внедренный компонент (если он есть), используя адрес, содержащийся в переменной m_pSelection для вызова функции COleClientltem::Draw. Эта
функция отображает компонент, проигрывая созданный программой-сервером метафайл. В полной программе-контейнере функция OnDraw обычно рисует все видимые внедренные компоненты, а также собственно данные контейнера.
Мастер AppWizard добавляет в класс представления обработчик команды New Object... из меню Edit программы-контейнера. Этот обработчик называется Onlnsertobject и выполняет следующие основные действия.
• Отображает обычное диалоговое окно InsertObject, позволяющее выбрать тип внедренного компонента.
• После закрытия диалогового окна создает объект CContDemoCntrltem для управления новым внедренным компонентом. Затем передает адрес объекта документа программы конструктору класса CContDemoCntrltem.
• Инициализирует объект класса CContDemoCntrltem, используя информацию объекта диалогового окна, основанную на установках, выбранных в диалоговом окне.
• Активирует компонент для его редактирования на месте.
• Присваивает m__pSelection адрес объекта CContDemoCntrltem для нового внедренного компонента.
Мастер AppWizard также добавляет в класс представления обработчик для клавиши Esc, являющейся одной из клавиш-акселераторов idr_cntr_inplace, действующих при редактировании на месте. Обработчик сообщения называется OnCancelEditCntr и вызывает функцию COleClientltem: : Close для закрытия компонента, редактируемого на месте, если таковой имеется. Функция OnCancelEditCntr работает в сочетании с методом OnCancelEditSrvr класса представления сервера, описанным ранее.
Ресурсы
Мастер AppWizard включает файл Afxolecl.rc в файл ресурсов программы. Файл Afxolecl.rc определяет несколько ресурсов, используемых классами контейнеров OLE из библиотеки MFC.
Мастер AppWizard определяет отдельное меню и соответствующую таблицу акселераторов для каждого из двух режимов, в которых может выполняться программа ContDemo. Меню IDR_mainframe и таблица акселераторов используется, когда нет активного внедренного компонента. Это меню содержит обычные команды, определяемые мастером AppWizard для программы, которая не относится к OLE, и несколько команд всплывающего меню Edit, указанных в контейнере OLE. К особенностям контейнера относятся команды Paste Special..., Insert New Object... и Links... и место для подменю Object (первоначально помеченное "<<OLE VERBS GO HERE>>"). Из всех специфических команд контейнера в генерируемом мастером AppWizard тексте программы реализуется только команда Insert New Object... и команды подменю Object.
Меню idr_cntr_in place и таблица акселераторов используются для редактирования внедренного компонента "на месте". Вид меню idr_cntr_inplace в редакторе меню Visual С++ показан на рис. 24.7. Как описано ранее, при редактировании на месте меню сервера объединяется с меню контейнера. Например, если программа ContDemo содержит активный внедренный компонент, сгенерированный программой ServDemo, объединенное меню будет таким, как на рис. 24.8. Меню программы ServDemo, отображаемое в редакторе меню, показано на рис. 24.5.
Предыдущая << 1 .. 147 148 149 150 151 152 < 153 > 154 155 156 157 158 159 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100