一、单文档视图构架程序
1.相关问题
只能管理一个文档(只有一个文档类对象)
2.相关类
CWinApp / CFrameWnd / CView / CDocument
CDocTemplate - 文档模板类
CSingleDocTemplate - 当文档模板类
CDocManager - 文档管理类
3.关系图
theApp
|--> m_pDocManager //文档管理类对象地址
|-->m_templateList //保存单文档模板类地址的链表
|-->CSingleDocTemplate(pTemplate)
|--> m_pOnlyDoc //文档类对象地址
|--> m_pDocClass //文档类静态变量地址,RUNTIME_CLASS( CMyDoc )
|--> m_pFrameClass //框架类静态变量地址,RUNTIME_CLASS( CMyFrameWnd )
|--> m_pViewClass //视图类静态变量地址,RUNTIME_CLASS( CMyView )
4.OnFileNew( )函数的执行过程
(1)通过应用程序类对象的成员m_pDocManager获取文档管理类对象地址
(2)通过文档管理类对象的成员m_templateList获取单文档模板类对象地址
(3)通过单文档模板类对象获取m_pDocClass(文档类静态变量),并用这个静态变量调用CreateObject函数创建文档类对象
(4)通过单文档模板类对象获取m_pFrameClass(框架类静态变量),并用这个静态变量调用CreateObject函数创建框架类对象
(5)利用框架类对象,调用LoadFrame函数,创建框架窗口
(6)在处理主框架窗口的WM_CREATE消息时,动态创建视图类对象,并创建视图窗口
(7)在处理视图窗口的WM_CREATE消息时,将视图类对象和文档类对象建立绑定关系
相关代码:
#include "stdafx.h" class CMyDoc : public CDocument { DECLARE_DYNCREATE(CMyDoc) }; IMPLEMENT_DYNCREATE(CMyDoc, CDocument) class CMyView : public CEditView { DECLARE_DYNCREATE(CMyView) }; IMPLEMENT_DYNCREATE(CMyView, CEditView) class CMyFrameWnd : public CFrameWnd { DECLARE_DYNCREATE(CMyFrameWnd) }; IMPLEMENT_DYNCREATE(CMyFrameWnd, CFrameWnd) class CMyWinApp : public CWinApp { public: virtual BOOL InitInstance(); }; CMyWinApp theApp; BOOL CMyWinApp::InitInstance() { CSingleDocTemplate *pTemplate = new CSingleDocTemplate( IDR_MENU1, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMyFrameWnd), RUNTIME_CLASS(CMyView)); AddDocTemplate(pTemplate); OnFileNew(); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; }