文档视图框架

摘自:http://ffwmxr.blog.163.com/blog/static/66372722201001604630889/

文档将描述MFC框架程序中WinApp , Document Templates, Document, View , Frame创建和所有关系。

CWinApp
在一个系统程序中只有一个CWinApp对象,该对象会被静态的创建并在MFC框架内部实现的WinMain()中进行初始化(动态链接库程序中不会包含一个CWinApp实例且程序的初始化是在DllMain()中进行)

CWinApp负责管理一个Document Template的链表(CPtrList), 在一个程序中通常会有一个或多个 Document Template,这些Document Template一般是在CWinApp类的虚函数InitInstance中从资源文件中加载的
同时WinApp对象拥有全部的框架窗体(Frame Window),主框架窗体(main frame window)必需被记录保存在WinApp对象的m_pMainWnd中;如果想实现个人的设定的化,可以在InitInstance的实现中改写预先由向导设定的m_pMainWnd;一般的,主框架窗体在SDI中为CMainFrame, 而在MDI中则是CMDIFrameWnd

CDoTemplate
Document Template负责管理Ducument的创建和管理, 它拥有全部全部由它创建的Document

在SDI中 CSingleDocTemplate负责跟踪唯一打开的Document
在MDI中CMultiDocTemplate用一个链表(CPtrList)来负责维护全部被打开的Document
CDocTemplate提供虚成员函数来增加或删除文档
CDocTemplate::AddDocument()
CDocTemplate::RemoveDocument()

同时CDocumentTemplate是CDocument的友元类,在CDocument中一个CDocumentTemplate的指针用来指向创建文档的Document Template

CWinApp负责实现OnFileOpen , 将会依次查询全部Document Template

CDocTemplate同时负责与Document和框架窗体关联的界面
CDocTemlate负责新建立的未命名文件的计数 将其命名为untitled X

CDocument
Document是为CDocument Template所有的
Document 负责维护当前显示文档的视图的链表(CPtrList)
Document不负责创建视图但是他们会在视图创建后关联在视图上,且当一个文档关闭(file open /close)时所有的关联的视图都将被关闭;同时最后一个与文档关联的视图关闭时文档也会被关闭
Document 提供结构AddView()   RemoveView()来维护视图链表
同时CDocument是CView的友元
在CView中的成员变量CView::m_pDocument用来指向视图所关联的文档

CFrameWnd
包括一些列的派生类CMDIFrameWnd CMDIChildWnd
负责创建在框架的客户区的窗体


---------------------------------------------------------------------------------------------------------------------------------------------

文档、文档模板、视图和框架类的互相访问

从该对象如何访问其他对象
全局函数调用全局函数AfxGetApp可以得到CWinApp应用类指针
应用AfxGetApp()->m_pMainWnd为框架窗口指针;用CWinApp::GetFirstDocTemplatePostion、CWinApp::GetNextDocTemplate来遍历所有文档模板
文档调用CDocument::GetFirstViewPosition,CDocument::GetNextView来遍历所有和文档关联的视图;调用CDocument:: GetDocTemplate 获取文档模板指针
文档模板调用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc来遍历所有对应文档
视图调用CView::GetDocument 得到对应的文档指针;调用CView::GetParentFrame 获取框架窗口
文档框架窗口调用CFrameWnd::GetActiveView 获取当前得到当前活动视图指针;调用CFrameWnd::GetActiveDocument 获取附加到当前视图的文档指针
MDI 框架窗口调用CMDIFrameWnd::MDIGetActive 获取当前活动的MDI子窗口(CMDIChildWnd)


  我们列举一个例子,综合应用上表中的函数,写一段代码,它完成遍历文档模板、文档和视图的功能:

CMyApp *pMyApp = (CMyApp*)AfxGetApp(); // 得到应用程序指针
POSITION p = pMyApp->GetFirstDocTemplatePosition();// 得到第1个文档模板
while (p != NULL) // 遍历文档模板
{
 CDocTemplate *pDocTemplate = pMyApp->GetNextDocTemplate(p);
 POSITION p1 = pDocTemplate->GetFirstDocPosition();// 得到文档模板对应的第1个文档
 while (p1 != NULL) // 遍历文档模板对应的文档
 {
  CDocument *pDocument = pDocTemplate->GetNextDoc(p1);
  POSITION p2 = pDocument->GetFirstViewPosition(); // 得到文档对应的第1个视图
  while (p2 != NULL) // 遍历文档对应的视图
  {
   CView *pView = pDocument->GetNextView(p2);
  }
 }
}


  由此可见,下面的管理关系和实现途径都是完全类似的:

  (1)应用程序之于文档模板;

  (2)文档模板之于文档;

  (3)文档之于视图。

  下面的图1、图2 分别给出了一个多文档/视图框架MFC程序的组成以及其中所包含类的层次关系。

文档、文档模板、视图和框架类的互相访问 - 小伟 -   小伟的博客
图1 多文档/视图框架MFC程序的组成


文档、文档模板、视图和框架类的互相访问 - 小伟 -   小伟的博客
图2 文档/视图框架程序类的层次关系

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值