ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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.