一、特点
只能管理一个文档
二、相关类
CWinApp / CFrameWnd / CView / CDocument - 文档类
CDocManager - 文档管理类
CDocTemplate - 文档模板类
CSingleDocTemplate - 单文档模板类
三、实例
1、添加三大框架,动态创建
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)
2、添加应用框架,手动创建
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; }
3、运行报错,需要添加字符串表
4、添加字符串表,右击资源,添加string table
5、运行结果:
6、关系图
theApp
|->m_pDocManager //文档管理类对象地址 |->m_templateList |->CSingleDocTemplate* pTemplate |->m_pOnlyDoc //文档类对象地址 |->m_pDocClass //文档类的静态变量的地址RUNTIME_CLASS(CMyDoc) |->m_pFrameClass //框架类的静态变量的地址RUNTIME_CLASS(CMyFrameWnd) |->m_pViewClass //视图类的静态变量的地址RUNTIME_CLASS(CMyView)
7、OnFileNew函数的执行过程
通过theApp获取文档管理类对象地址(m_pDocManager)
通过文档管理类对象地址(m_pDocManager)获取一个链表成员(m_templateList)并从链表中获取单文档模板类对象(pTemplate)
利用单文档模板类对象(pTemplate)获取文档类的静态变量地址,并调用对象加工厂函数,动态创建文档类对象,并返回对象地址。
利用单文档模板类对象(pTemplate)获取框架类的静态变量地址,并调用对象加工厂函数,动态创建子框架类对象,并返回对象地址。
利用框架类对象调用LoadFrame函数,创建主框架窗口.在处理框架窗口的WM_CREATE消息时,动态创建视图类对象并创建视图窗口。
在处理视图窗口的WM_CREATE消息时,将视图类对象和文档类对象建立绑定关系