Программирование >>  Процедурные приложения 

1 ... 132 133 134 [ 135 ] 136 137 138 ... 150


{

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



1 ... 132 133 134 [ 135 ] 136 137 138 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика