Чтение онлайн

ЖАНРЫ

Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

Фролов Григорий Вячеславович

Шрифт:

 return TRUE;

}

Метод Serialize вызывается в тех случаях, когда надо загрузить документ из файла на диске или наоборот, записать его в файл:

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

// Метод Serialize класса CMultiDoc

void CMultiDoc::Serialize(CArchive& ar) {

 if (ar.IsStoring) {

// TODO:

 } else {

// TODO:

 }

}

Методы AssertValid
и Dump класса CMultiDoc

Методы AssertValid и Dump переопределяются в классе CMainFrame только для отладочной версии приложения и используются при отладке приложения:

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

// Диагностические методы класса CMultiDoc

#ifdef _DEBUG

void CMultiDoc::AssertValid const {

 CDocument::AssertValid;

}

void CMultiDoc::Dump(CDumpContext& dc) const {

 CDocument::Dump(dc);

}

#endif //_DEBUG

Класс окна просмотра документа

Класс окна просмотра документа, также как класс документа и главный класс приложения, имеют своего двойника в однооконном приложении. Так, в приложении Single определен класс окна просмотра CSingleView, совпадающий с классом CMultiView.

Рис. 1.13. Окно Project Workspace, класс CMultiView

Вы можете просмотреть список методов, входящих в класс CMultiView, если откроете в окне Project Workspace страницу ClassView (рис. 1.13). А сейчас приведем определение класса CMultiView :

class CMultiView : public CView {

protected:

 CMultiView;

 DECLARE_DYNCREATE(CMultiView)

// Attributes

public:

 CMultiDoc* GetDocument;

// Operations

public:

// Overrides

 //{{AFX_VIRTUAL(CMultiView)

public:

 virtual void OnDraw(CDC* pDC);

 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

 //}}AFX_VIRTUAL

// Implementation

public:

 virtual ~CMultiView;

#ifdef _DEBUG

 virtual void AssertValid const;

 virtual void Dump(CDumpContext& dc) const;

#endif

protected:

 //{{AFX_MSG(CMultiView)

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP

};

Как

видите, класс CMultiView наследуется от базового класса CView. Вы, однако, можете наследовать этот класс и от некоторых других классов библиотеки MFC.

Метод GetDocument класса CMultiView

В секции атрибутов класса CMultiView после комментария Attributes объявлен метод GetDocument. Этот метод возвращает указатель на документ, связанный с данным окном просмотра. Если окно просмотра не связано ни с каким документом, метод возвращает значение NULL.

Метод GetDocument имеет две реализации. Одна используется для отладочной версии приложения, а другая – для окончательной. Окончательная версия GetDocument определена непосредственно после самого класса окна просмотра CMultiView как встраиваемый (inline ) метод:

#ifndef _DEBUG

inline CMultiDoc* CMultiView::GetDocument { return (CMultiDoc*) m_pDocument; }

#endif

Переменная m_pDocument является элементом класса CView, определенным как protected. В документации на класс CView описание элемента m_pDocument отсутствует. Однако, вам достаточно знать, что после инициализации документа и окна просмотра в нем записан указатель на соответствующий документ. Если вы желаете получить дополнительную информацию, обратитесь к исходным текстам библиотеки MFC. Вы найдете определение класса CView и элемента этого класса m_pDocument в файле Afxwin.h.

Метод GetDocument совпадает с одноименным методом класса окна просмотра однооконного приложения за исключением того, что тип возвращаемого им указателя CMultiDoc.

Отладочная версия GetDocument расположена в файле реализации класса окна просмотра MultiView.cpp:

#ifdef _DEBUG

CMultiDoc* CMultiView::GetDocument {

 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMultiDoc)));

 return (CMultiDoc*) m_pDocument;

}

#endif //_DEBUG

Таблица сообщений класса CMultiView

Таблица сообщений класса CMultiView располагается в файле MultiView.cpp. Непосредственно перед ней расположена макрокоманда IMPLEMENT_DYNCREATE:

// Объекты класса CMultiView создаются динамически

IMPLEMENT_DYNCREATE(CMultiView, CView)

// Таблица сообщений класса CMultiView

BEGIN_MESSAGE_MAP(CMultiView, CView)

 //{{AFX_MSG_MAP(CMultiView)

 //}}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

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

Конструктор и деструктор класса CMultiView не выполняют полезной работы. MFC AppWizard создает для них только пустые шаблоны, которые вы можете “наполнить” сами:

Поделиться с друзьями: