MDI

 

MDI里面到底有些什么?所有的一切都从下面的代码开始:

这个代码分为两段:第一段是与MDI所有对象相关,第二段是程序启动的cmd相关。

 

1.先看第一段:MDI到底有哪些对象他们之间的关系。

总的来说,所有需要关注的对象是:theApp,DocManager, docTemplate, mainFrame,childFrame, view, doc

一个app可以有多个docTemplate.一个mainFrame可以有多个childFrame;一个childFrame可以有多个view;一个doc可以对应多个view

但是我们可以从下面的分析中看到,在默认生成的MDI程序中,在发出OnFileNew命令后,会有一个新的childFrame产生,在这个childFrame里面会有一个新的view产生,会有一个新的doc产生,同时这个doc对应这个新的view。如果要想实现一个childFrame有多个view或者一个doc对应多个view,就需要熟悉默认产生的MDI程序结果,然后去重载虚函数实现。

 

).theApp有一个CDocManager类的对象成员,用来管理docTemplate

CDocManager 类则拥有一个指针链表 CPtrList m_templateList来维护这些文档模版。这些文档模版都是在 CAApp:: InitInstance()中通过 AddDocTemplate(pDocTemplate)

CDocTemplate拥有 3个成员变量,分别保存着 Document View Frame CRuntimeClass指针,另外持有成员变量 m_nIDResource,用来指定这个 Document显示时候采用的菜单资源。这 4份数据都在 CAApp:: InitInstance()中 CDocTemplate的构造函数中指定。在 Document中拥有一个回指 CDocTemplate的指针( m_pDocTemplate)。

DocTemplate还有一个成员变量m_docList保存着所有doc的指针。

 

具体的可以看下面的代码:

  

 

(2) 一个文档可以有多个视图,由 Document中成员变量 CPtrList m_ViewList维护。

CView 中拥有一个成员变量 CDocument* m_pDocument指向该视图相关的 Document

 

(3).我们在程序中找不到 childFramelist和所有viewlist,这些list只是在系统内部维护,看不到源代码。

但是我们可以确定的是:在任何时刻,程序中只有一个活动的文档、框架和视图,即当前的文档、框架、视图。

需要注意:childFrame有自己的菜单,和mainframe的菜单不一样,可以参考word程序的架构

 

1.       cmd相关的代码

CCommandLineInfo的构造函数会默认的把cmdInfo设置为 FileNew

ParseCommandLine的作用主要是分析命令行参数,如果没有命令行参数ParseCommandLine()就假定用户想新建一个文档,于是cmdInfo仍然是FileNew命令,如果命令行参数中有一个文件名,ParseCommandLine()就假定用户想打开该文件,于是设置一个FileOpen命令。

ProcessShellCommand就是对cmdInfo进行处理,如下所示。

 

实践1:如果想让程序开始什么也不做,也就是不创建任何文档,只需要把cmdInfo设置为FileNothing即可。

Ex: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

 

 

3.OnFileNew发出后,frame/view/doc的创建流程:

创建都是在OpenDocumentFile开始的。

首先会创建一个全新的doc,并且会把这个doc加入到 CMultiDocTemplate::m_docList 中去。

然后会创建一个全新的childFrame, 然后又会在 CFrameWnd::OnCreateClient()中创建 view, 会在CView::OnCreateView()时,把view加入到刚新创建的 pDoc 中去。

 

就像上面说的,这里创建的childFrame只有一个view,一个pDoc只对应一个 view。 如果想实现其它的功能,比如一个 pDoc 对应多个 view,那就需要自己重写某些虚函数。

 

实践1:在程序启动的时候,一个DocTemplate对象里面存储的view、doc、frame都只是一个类。也就是说,如果程序中只有一个docTemplate的话,那么即使实现了一个doc对应多个view的情况,这个view也是同一个类的不同对象,不会是不同类的不同对象。因为 无论是CMultiDocTemplate还是CSingleDocTemplate都是继承于CDocTemplate,所以从下面的代码可以看出,对于一个特定的DocTemplate他们的viewdocframe都是同一个类的对象。

 

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值