Файл: Технол_разраб_прогр_обесп_Гагарина_Кокарева.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 20.11.2019

Просмотров: 13453

Скачиваний: 411

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

CntDoc.cpp: реализация класса CCntDoc// #1пс]^е ,,stdafx.h,, #include ,,Cnt.h,,

# include "CntDoc.h" #include "Cntrltem.h" tifdef _DEBUG #define new DEBUG_NEW lundef THIS_FILE

static char THIS_FILE[] FILE

#endif

1111111111111111111111111111111111111111111111111111111 /7 CcntDoc

IMPLEMENT_DYNCREATE (CCntDoc, COleDocument) BEGIN_MESSAGE_MAP (CCntDoc, COleDocument)

//{{AFX_MSG_MAP (CCntDoc)

// ПРИМЕЧАНИЕ: мастер классов будет добавлять // и удалять здесь макросы схемы сообщений. // НЕ РЕДАКТИРУЙТЕ то, что здесь находится. //}}AFX_MSG_MAP

// Используется стандартная реализация OLE-контейнера ON_UPDATE_COMMAHD_UI ( ID_EDIT_PASTE,

COleDocument: :OnUpdatePasteMenu) ON_OPDATE_COMMAMD_OI (

I D_E DI T__P AS TE_L INK

COleDocument: :OnUpdatePasteLinkMenu) ON_UPDATE_COMMMJD_UI ( I D_OLE__E DI T_CONVERT

COleDocument: :OnUpdateObjectVerbMenu) ON__COMMAND (ID_OLE_EDIT_CONVERT,

COleDocument: :OnEditConvert) ON_OPDATE_COMMAHD_OI (ID_OLE_EDIT_LINKS,COleDocument: :OnUpdateEditLinksMenu) ON_COMMAND (ID_OLE_EDIT_LINKS COleDocument: :OnEditLinks)

ON_0PDATE_COMMAND_UI__RftNGE ID_OLE_VERB_FIRST ID_OLE_VERB_IAST,

COleDocument: :OnUpdateObjectVerbMenu) END_MESSAGE_MAP 0

// Конструктор и деструктор класса CCntDoc '

CCntDoc: CCntDoc( {

// Включается поддержка составных файлов EnablecompoundFile

// Здесь добавьте код конструктора. }

CCntDoc::-CCntDoc()

{

}

BOOLCCntDoc: OnNewDocument( ) {

if ( COleDocument OnNewDocument return

FALSE;

// Здесь добавьте код повторной инициализации // (специфика SDI-приложений)

return TRUE; }

///////////////////////////////////////////////////////

// Сериализация класса CcntDoc

void CCntDoc::Serialize(CArchive sar)

if (ar. IsStoringO )

{

// Здесь добавьте код сохранения. }

else.

// здесь добавьте код загрузки. }

// Вызов функции базового класса COleDocument

// обеспечивает сериализацию объектов COleClientltem,

// содержащихся в документе контейнера.

COleDocument : : Serialize (ar ) ; }

Диагностика класса CcntDoc tifdef _DEBUG

void CCntDoc::AssertValid() const {

COleDocument::AssertValid(); }

void CCntDoc: Dump (CDumpContext .&dc) const { COleDocument: :Dump(dc) } lendif // DEBUG

Другие функции класса CcntDoc

Обратите внимание на функцию ЕпаЫеСотроипс1РПе(), вызываемую в конструкторе. Эта функция осуществляет поддержку составных файлов, что позволяет сохранять документы с внедренными объектами в специальном структурированном формате.

4. Файл CNTVIEW.CPP

CntView.cpp реализация класса CCntView

^include "stdafx.h" #include "Cnt.h" #include "CntDoc.h" ttinclude "Cntrltem.h" #include "CntView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE

static char THIS__FILE[] _FILE_; ttendif

CcntView

IMPLEMENT_DYNCREATE(CCntView, CView)

BEGIN_MES SAGE_MAP(CCntView, CView) //{{AFX_MSG_MAP(CCntView)

// ПРИМЕЧАНИЕ: мастер классов будет добавлять // и удалять здесь макросы схемы сообщений. // НЕ РЕДАКТИРУЙТЕ то, что здесь находится.

ON_WM_DE S Т ROY() ON_WM_SETFOCUS() ON_WM_SIZE()

ON_COMMAND (ID_OLE_INSERT_NEW, OnlnsertObject) ON_COMMAND(ID_CANCEL_EDIT_CNTR, OnCancelEditCntr) //}}AFX_MSG_MAP // Стандартные команды печати

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END MESSAGE MAP ()

Конструктор и деструктор класса CcntView

CCntView::CCntView() m_pSelection NULL;

здесь добавьте код конструктора.

}

CCntView::-CCntView() }

BOOL CCntView::PreCreateWindow(CREATESTRUCT Ses)

Здесь можно модифицировать класс окна, изменяя поля структуры сз.

return CView::PreCreateWindow(cs);

Отображение документа

void CCntView::OnDraw(CDC* pDC) CCn.tDoc* pDoc GetDocument () ; ASSERT_VALID(pDoc);

Здесь добавьте код для отображения собственных данных.

Должны отображаться все OLE-объекты, содержащиеся в документе. Выделенный элемент может быть нарисован в произвольном месте.


Этот код следует удалить в том случае, если вы вводите собственный код рисования. Указанные ниже координаты в точности соответствуют координатам, возвращаемым объектом CCntCntrltem, что создает эффект непосредственного редактирования.

удалите следующий код, если реализуете собственный код рисования.

if (m_pSelection NULL) {

POSITION pos pDoc-X3etStartPosition() m_pSelection (CCntCntrltem*) pDoc-XSetNextClientltern (pos); if (m_pSelection NULL)

m_pSelection->Draw(pDC, CRect(10, 10,210,210)); }

void CCntView::OnlnitialUpdate() CView::OnlnitialUpdate ();

Удалите следующий код, если реализуете собственный код инициализации.

m_pSelection NULL;

инициализация переменной, содержащей указатель на выделенный объект

// Печать документа

BOOL CCntView: :OnPreparePrinting (CPrintlnf о* plnfo) {

Стандартные действия по подготовке к печати return DoPreparePrinting (plnfo) ;

)

void CCntView:.-OnBeginPrinting (CDC* /*pDC*/, CPrintlnfo* /*plnfo*/) {

Добавьте код дополнительной инициализации перед печатью.

void CCntView::OnEndPrinting(CDC* /*pDC*/, CPrintlnfo*

/*plnfo*/)

{

Добавьте код очистки после печати.

}

void CCntView::OnDestroy() {

Деактивировать объект при удалении; это важно, если используется режим разделения окна просмотра.

CView::OnDestroy(); COleClientltem* pActiveltem GetDocument()->

GetlnPlaceActiveltem(this); if (pActiveltem NULL && pActive!tem-> GetActiveView() this) {

pActive!tem->DeactivateO; ASSERT(GetDocument()->

GetlnPlaceActiveltem(this) NULL);

}

}

// Поддержка OLE-клиентов

BOOL CCntView::IsSelected(const CObject* pDocItem)

const

{

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

return pDocItem m_pSelection; void CCntView::OnlnsertObject()

// Вызов стандартного диалогового окна InsertObject // для получения информации о новом объекте CCntCntrltem.

COlelnsertDialog dig;

if (dlg.DoModaK) IDOK) return;

BeginWaitCursor()

CCntCntrltem* pltem NULL;

TRY

Создаем новый объект, связанный с этим документом.

CCntDoc* pDoc GetDocument(); ASSERT_VALID(pDoc); pltem new CCntCntrltem(pDoc); ASSERT_VALID(pltem);

Инициализация объекта на основании данных, полученных из диалогового окна.

if (!dig.Createltem(pltem)) AfxThrowMemoryException() ;

Подойдет исключение любого типа

ASSERT_VALID(pltem);

Если объект был выбран из списка классов, а не загружен из файла, запускаем сервер для редактирования объекта,

if (dig.GetSelectionType() COlelnsertDialog::createNew!tern) pitem->DoVerb(OLEIVERB_SHOW, this); ASSERT_VALID(pltem);

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

m_pSelection pltem;

// Указатель устанавливается на // последний введенный объект

pDoc->UpdateAHViews (NULL) CATCH(CException, e) if (pltem NULL) ASSERT_VALID(pltem) p!tem->Delete() AfxMessageBox(IDP_FAILEDJTO_CREATE); END_CATCH EndWaitCursor(); >

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

voidCCntView::OnCancelEditCntr()

Редактируемый объект закрывается.

COleClientltem* pActiveltem= GetDocument()-> GetlnPlaceActiveltem(this); if (pActiveltem NULL) pActive!tem->Close();

ASSERT(GetDocument()->GetInPlaceActiveItem(this)

NULL);

}

Обработчики OnSetFocusn OnSize требуются контейнеру в случае непосредственного редактирования объекта.


void CCntView: :OnSetFocus (CWnd* pOldWnd) {

COleClientltem* pActiveltem GetDocument ( GetlnPlaceActiveltem(this) if (pActiveltem NULL && pActive!tem->GetItemState () COleClientltem: :activeUIState)

Фокус необходимо установить на объект, если он находится в той же области просмотра.

CWnd* pWnd pActiveltem- >GetInPlaceWindow(

if (pWnd NULL)

{

pWnd->SetFocus( ) ; // метод SetFocus базового класса

// не вызывается return; }}

CView::OnSetFocus(pOldWnd); }

void CCntView: :OnSize (UINT nType, int ex, int cy) {

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(dp); }

CCntDoc* CCntView::GetDocument() // отладочная версия

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLAS S

(CCntDoc))); return (CCntDoc*)m_pDocument; #endlf // DEBUG

Обработчики сообщений класса CCntView

Чтобы приложение могло отображать внедренные объекты, были внесены изменения в функцию ОпБга\у( ). Обратите внимание на такой фрагмент:

if (т_рЗе1ес^оп !=NULL)

m_pSeleotion->Draw(рОС, CRectdO, 10,210, 210)); }

По умолчанию объект размещается в окне приложения в заранее заданной области, которая определяется конструктором СКесЦ ). Указанные координаты можно изменить вручную.

В файл были также добавлены функции Оп1пШа1ирс1а1е(), ЬБексЛесЮ, ЫгаелО^есЛО, ОпСапсе!Ес1кСтг(), ОпЗегРосшОИ Оп81ге(). В частности, функция ОЫшеПОфес^) вызывает стандартное диалоговое окно класса С01е1п5еПЕИа1о§, предназначенное для вставки объектов.

5. Файл CNTRITEM.CPP

Файл CNTRJ.TEM.CPP, листинг которого приведен ниже, содержит реализацию класса ССтСпггкет.

Сг^гЗ^ет. срр: реализация класса ССг^Сг^гЗ^ет

#include "stdafx.h" #include "Cnt.h" #include "CntDoc.h" #include "CntView.h" #include "Cntrltem.h" #ifdef JDEBUG #define new DEBUG_NEW tundef THIS_FILE

static char THIS_FILE[] FILE

#endif

// CcntCntrltem

IMPLEMENT__SERIAL (CCntCntrltem, С01еС11еп^ет, 0) CCntCntrltem: CCntCntrltem (СО^Иос* рСс^а1пег) C01eClientltem (pContainer)

здесь добавьте код конструктора.

ССп^п^^ега: :-ССп^п^^ет здесь добавьте код очистки.

void CCntCntrltem::OnChange(OLE_NOTIFICATTON nCode, DWORD dwParam)

ASSERT_VALID(this) COleClientltem::0nChange(nCode, dwParam);

Редактируемому объекту посылается уведомление OnChange,свидетельствующее об изменении его состояния или внешнего вида. Обозначьте рабочую область объекта как недействительную путем вызова функции UpdateAllViews.

GetDocument()->UpdateAlIViews(NULL)

BOOL CCntCntrltem::OnChangeltemPosition(const CRect SrectPos)

ASSERT_VALID(this) ;

В процессе непосредственного редактирования данная функция вызывается сервером для изменения позиции окна редактирования.

По умолчанию вызывается метод базового класса, который, в свою очередь, задействует функцию COleClientltem::SetltemRects для перемещения объекта в новую позицию.

if (!COleClientltem::OnChangeltemPosition(rectPos)) return FALSE;

обновите всю кэшированную информацию, связанную с размерами объекта.

return TRUE; )

void CCntCntrltem::OnGetItemPosition(CRect SrPosition) ASSERT_VALID(this) ;

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

По умолчанию заданы фиксированные координаты. Запишите правильные координаты (в пикселях) в переменную гPos ition.

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) ;

Теперь сериализуем данные, специфичные для объекта

CCntCntrltem.

if (ar.IsStoringO {

здесь добавьте код сохранения.


else{

здесь добавьте код загрузки.

//Диагностика класса CcntCntrltem #if<fef _DEBUG

void CCntCntrltem: :AssertValid const

COleClientltem::&ssertValidO;

}

void CCntCntrltem: :Dump(CDumpContext1 &dc) const

COleClientltem::Dump(dc);

#endif

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