|
Программирование >> Процедурные приложения
#include CntDoc.h #include Cntrltem.h #include CntView.h #ifdef DEBUG #define new DEBUG NEW #undef THIS FILE static char THIS FILE[] = FILE ; #endif CCntView IMPLEMENT DYNCREATE(CCntView, CView) BEGIN MESSAGE MAP(CCntView, CView) {{AFX MSG MAP(CCntView) ПРИМЕЧАНИЕ: мастер классов будет добавлять и удалять здесь макросы схемы сообщений. НЕРЕДАКТИРУЙТЕ то, что здесь находится. ON WM DESTROY() 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; TODO: здесь добавьте код конструктора. CCntView::-CCntView() BOOL CCntView::PreCreateWindow(CREATESTRUCT Ses) { TODO: здесь можно модифицировать класс окна, изменяя поля структуры сз. return CView::PreCreateWindow(cs); }
Отображение документа void CCntView::OnDraw(CDC* pDC) { CCn.tDoc* pDoc = GetDocument () ; ASSERT VALID(pDoc); TODO: здесь добавьте код для отображения собственных данных. TODO: должны отображаться все OLE-объекты, содержащиеся в документе. Выделенн1й элемент может быть нарисован в произвольном месте. Этот код следует удалить в том случае, если вы вводите собственный код рисования. Указанные ниже координаты вточности соответствуют координатам, возвращаемым объектом CCntCntrltem, что создает эффект непосредственного редактирования. TODO: удалите следующий код, если реализуете собственный код рисования. if (m pSelection == NULL) POSITION pos = pDoc-X3etStartPosition() ; m pSelection = (CCntCntrItem*) pDoc-XSetNextClientltern(pos); > if (m pSelection != NULL) m pSelection->Draw(pDC, CRect(10, 10,210,210)); void CCntView::OnInitialUpdate() { CView::OnInitialUpdate(); TODO: удалите следующий код, если реализуете собственный код инициализации. m pSelection = NULL; инициализация переменной, содержащей указатель на выделенный объект
Печать документа BOOL CCntView: :OnPreparePrinting (CPrintlnf о* plnfo) { стандартные действия по подготовке к печати return DoPreparePrinting (plnfo) ; void CCntView::OnBeginPrinting (CDC* /*pDC*/, CPrintlnfo* /*plnfo*/) { TODO: добавьте код дополнительной инициализации перед печатью. } void CCntView::OnEndPrinting(CDC* /*pDC*/, CPrintlnfo* /*plnfo*/) TODO: добавьте код очистки после печати. void CCntView::OnDestroy() Деактивиэировать объект при удалении; это важно, если используется режим разделения окна просмотра. CView::OnDestroy(); COleClientltem* pActiveltem = GetDocument()-> GetlnPlaceActiveltem(this); if (pActiveltem != NULL && pActive!tem-> GetActiveView() == this) { pActive!tem->Deactivate0; ASSERT(GetDocument()-> GetlnPlaceActiveltem(this) == NULL);
Поддержка OLE-клиентов BOOL CCntView::IsSelected(const CObject* pDocItem) const Представленная ниже реализация подходит, если выделенными являются только объекты CCntCntrltem. В противном случае данный код следует заменить. TODO: реализуйте функцию, которая проверяет тип выделенного объекта. return pDocItem == m pSelection; } void CCntView::0nlnsert0bject() ( Вызов стандартного диалогового окна 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 (dlg.GetSelectionType() == COlelnsertDialog::createNew!tem) p!tem->DoVerb(OLEIVERB SHOW, this); ASSERT VALID(pltem); Последний введенный объект выделяется. TODO: введите код, соответствующий требованиям вашего приложения. m pSelection = pltem; Указатель устанавливается на последний введенный объект pDoc->UpdateAHViews (NULL) ; CATCH(CException, e) if (pltem != NULL) ASSERT VALID(pltem) ; p!tem->Delete() ; AfxMessageBox(IDP FAILED TO CREATE); END CATCH EndWaitCursor(); > Следующий обработчик позволяет с помощью клавиатуры прерывать сеанс непосредственного редактирования. Инициируется это контейнером, а не сервером, voidCCntView::OnCancelEditCntr() Редактируемый объект закрывается. COleClientltem* pActiveltem= GetDocument()-> GetlnPlaceActiveltem(this); if (pActiveltem != NULL) pActive!tem->Close(); ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL); Обработчики OnSetFocusи 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)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |