|
Программирование >> Процедурные приложения
{ CView: :OnSize (nType, ex, cy) ; COleClientltem* pActiveltem = GetDocument ()-> GetlnPlaceActiveltem(this) ; if (pActiveltem != NULL) pActiveItem->SetItemRects () ; / ДиагностикаклассаCCntView tifdef DEBUG void CCntView::AssertValid() const CView::AssertValid(); } void CCntView::Dump(CDumpContext Sdc) const CView::Dump(dc); } CCntDoc* CCntView::GetDocument() отладочнаяверсия ASSERT(m pDocument->IsKindOf(RUNTIME CLASS(CCntDoc))); return (CCntDoc*)m pDocument; #endlf DEBUG
Обработчики сообщений класса CCntView Чтобы приложение могло отображать внедренные объекты, были внесены изменения в функцию OnDraw( ). Обратите внимание на такой фрагмент: if (m pSelection !=NULL) m pSeleotion->Draw(pDC, CRectdO, 10,210, 210)); По умолчанию объект размещается в окне приложения в заранее заданной области, которая определяется конструктором CRect( ) . Указанные координаты можно изменить вручную. В файл были также добавлены функции OnlnitialUpdate() , IsSelectedO, OnlnsertObject() , OnCancelEditCntr() , OnSetFocusOM OnSize(). В частности, функция OnlnsertObject() вызывает стандартное диалоговое окно класса COlelnsertDialog, предназначенное для вставки объектов. Файл CNTRITEM.CPP Файл CNTRITEM.CPP, листинг которого приведен ниже, содержит реализацию класса CCntCntrltem. Cntrltem.cpp: реализация класса CCntCntrltem #include stdafx.h #include Cnt.h #include CntDoc.h #include CntView.h #include Cntrltem.h #ifdef DEBUG #define new DEBUG NEW tundef THIS FILE static char THIS FILE[] = FILE ; #endif CCntCntrltem IMPLEMENT SERIAL (CCntCntrltem, COleClientltem, 0) CCntCntrltem: : CCntCntrltem (CCntDoc* pContainer) : COleClientltem (pContainer) { TODO: здесь добавьте код конструктора. CCntCntrltera::~CCntCntrItem () { TODO: здесь добавьте код очистки. void CCntCntrltem::OnChange(OLE NOTIFICATION nCode, DWORD dwParam) ASSERT VALID(this); COleClientltem::OnChange(nCode, dwParam); Редактируемому объекту посылается уведомление OnChange, свидетельствующее об изменении его состояния или внешнего вида. TODO: обозначьте рабочую область объекта как недействительную путем вызова функции UpdateAllViews. GetDocument()->UpdateAllViews(NULL); BOOL CCntCntrltem::OnChangeItemPosition(const CRect SrectPos) ASSERT VALID(this); В процессе непосредственного редактирования данная функция вызывается сервером для изменения позиции окна редактирования. По умолчанию вызывается метод базового класса, который, в свою очередь, задействует функцию COleClientltem::SetItemRects для перемещения объекта в новую позицию. if (!COleClientltem::OnChangeItemPosition(rectPos)) return FALSE; TODO: обновите всю кэшированную информацию, связанную с размерами объекта. return TRUE; ) void CCntCntrltem::OnGetItemPosition(CRect SrPosition) ASSERT VALID(this); В процессе непосредственного редактирования данная функция позволяет определить координаты области, занимаемой объектом. По умолчанию заданы фиксированные координаты. TODO: запишите правильные координаты ( в пикселях) в переменную rPosition. rPosition.SetRect(10, 10,210, 210); void CCntCntrltem: :OnActivate() { Допускается только один сеанс редактирования в окне приложения. CCntView* pView = GetActiveView ( ) ; ASSERT VALID(pView) ; COleClientltem* pltem = GetDocument ( ) -> GetlnPlaceActiveltem(pView) ; if (pltem !- NULL ss-pltem != this) p!tem->Close () ; COleClientltem: : OnAct ivate ( ) ; void CCntCntrltem: :OnDeactivateUI (BOOL bUndoable) { COleClientltem: :OnDeactivateUI (bUndoable) ; Скрывает объект, если он бьш . активизирован обычным способом DWORDdwMisc = 0; m lpObject->GetMiscStatus (GetDrawAspect () , SdwMisc) ; if (dwMisc & OLEMISC INSIDEOUT) DoVerb (OLEIVERB HIDE, NULL) ; void CCntCntrltem: : Serialize (CArchive Sar) { ASSERT VALID(this) ; Вызов функции базового класса для считывания данных, связанных с объектом COleClientltem. При этом инициализируется указатель m j>Document, возвращаемый функцией CCntCntrltem: :GetDocument, поэтому функцию базового класса лучше вызывать вначале. COleClientltem: : Serialize (ar); 406 Теперь сериализуем данные, специфичные для объекта CCntCntrltem. if (ar.IsStoringO ) TODO: здесь добавьте код сохранения. } else{ TODO: здесь добавьте код загрузки. / Диагностика класса CCntCntrltem #if<fef DEBUG void CCntCntrltem: :AssertValid () const COleClientltem::&ssertValid0; void CCntCntrltem: :Dump(CDumpContext &dc) const COleClientltem::Dump(dc); #endif Основное назначение этого файла состоит в отслеживании координат и размеров области, занимаемой внедренным объектом. Обратите внимание на фрагмент, выделенный полужирным шрифтом. Именно здесь задаются координаты, о которых говорилось при рассмотрении файла CNTVIEW.CPP. Проверка работы контейнера А теперь давайте проверим, как функционирует разработанное нами приложение-контейнер. Вспомните, что в данном случае мы имеем дело лишь с шаблоном приложения. Никакие дополнительные функциональные возможности в него не добавлялись, тем не менее такая программа является вполне работоспособной. Окно нашей программы показано на рис. 21.8. В нее можно внедрять объекты, созданные в любом другом приложении Windows, поддерживающем технологию OLE. В качестве примера мы внедрим в программу электронную таблицу Excel. Выберите в меню Edit команду InsertNewObject..., в результате чего откроется стандартное диалоговое окно вставки объекта. В этом окне выделите элемент, соответствующий электронной таблице Excel(рис. 21.9) Рис.21.8. Окно приложения Cnt
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |