CWinApp类CMultiDocTemplate类CDocument类CView类的关系

转自:http://blog.csdn.net/bboot/article/details/26884011

不得不转,瞬间搞清了很多问题,短小精悍

1.CWinApp类  

它包含并管理着应用程序的文档/视窗的所有信息。它有一个成员变量CDocManager*m_pDocManager,此变量是文档/视窗的管理器;m_templateList 是CDocManager里的一个列表,此列表里保存了所有文档模板的指针,当用户调用CWinApp::AddDocTemplate(pDocTemplate)后该pDocTemplate存入了CWinApp::m_pDocManager::m_templateList这个链表里。

下面的两个函数是对 m_templateList的查找和遍历操作:

CWinApp::GetFirstDocTemplatePosition()//获得第一个文档模板的 POSITION类型的位置 
  CWinApp::GetNextDocTemplate(POSITION&pos) //获得pos位置的文档模板,并将下一个模板的POSITOON位置传给pos;

2.CDocTempplate类

一般常用其派生类CSingleDocTemplate类和CMultiDocTemplate类

(1).CSingleDocTemplate类 (继承与CDocTempplate类)

一次只能打开一个文档且对应一个视图或者多个,可以打开多种类型的文档(打开一种关闭另一种文档)

(2).CMultiDocTemplate类 (继承与CDocTempplate类)

这是一个极重要的类。CMultiDocTemplate::m_docList保存着所有该种文档的文档实例的指针列表。下面两个函数用于维护CMultiDocTemplate::m_docList数据  
CMultiDocTemplate::AddDocument(CDocument*  pDoc);  
CMultiDocTemplate::RemoveDocument(CDocument*  pDoc);  
而下面的两个函数用于遍例该文档类型所有文档实例。  
CMultiDocTemplate::GetFirstDocPosition()const;  
CMultiDocTemplate::CDocument*GetNextDoc(POSITION&rPos)const;  
3.CDocument类 
CDocument每一个文档实例可有多个视与之相对应。  
CDocument::m_viewList用来保存所有与此文档实例相关的View  
CDocument::GetDocTemplate可获得相应的文档模板例如CMultiDocTemplate类型的文档模板的实例;

4、CView类

例如在多文档视图的框架下每一个CMDIChildWnd有一个View

CView::GetDocument可获得与此视相关的CDocument  
CView::GetParentFrame()可获得CMDIChildWnd;

通过以上分析可见CWinApp,CMDIChildWnd,CView,CDocument,CMultiDocTemplate之间知道其中一个实例必可知道其他所有几个实例,CWinApp统领全局,任何时候只要获得CWinApp实例,则所有的文档模板文档实例,视图,Frame窗口均可被枚举出来。AfxGetApp()获得CWinApp实例指针。

CWinApp类CMultiDocTemplate类CDocument类CView类的关系,布布扣,bubuko.com

时间: 2024-07-30 13:50:14

CWinApp类CMultiDocTemplate类CDocument类CView类的关系的相关文章

MFC中CMainFrame类CDoc类CView类CApp类之间关系

用APPWIZARD这个工具声称的应用程序架构包括了应用程序基本的四个类, 分别是:CApp,CMainFrame,CDoc,CView. 其中 CApp负责整个应用程序的管理,CDOC类中有一个CAPP的指针,也可以认为应用程序是从CApp开始执行的. CMainFrame是主窗口框架 CDoc是应用程序数据来源(文档)主要是用来管理数据,提供保存和加载数据的功能.有关文件的读写操作在CDoc的Serialize函数中进行. CView是应用程序数据显示(视图)主要是用来数据显示,以及给用户提

【python】-- 类的多继承、经典类、新式类

继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承. class SchoolMember(object): #SchoolMember类 '''学校成员基类''' def tell(self): print("the schoolmeber is tell...") class School(ob

【C++缺省函数】 空类默认产生的6个类成员函数

1.缺省构造函数. 2.缺省拷贝构造函数. 3. 缺省析构函数. 4.缺省赋值运算符. 5.缺省取址运算符. 6. 缺省取址运算符 const. <span style="font-size:18px;"> class A { public: A(){}//缺省构造函数 A(const A&){}//拷贝构造函数 ~A(){}//析构函数 A&operator=(const A&){}//赋值运算符 A*operator&(){}//取址运算

Python3基础 类的组合 把类的实例化放到一个新类里面

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: class Girls: def __init__(self,num): self.num=num class OurClass: #组合,其他类的实例化,在这里类的实例化中进行 def __init__(self,boyNum,girlNum): self.boys=Boys

千兆网络中——使用五类线、超五类线和六类线的区别

去年入手了一台Seagate的Central.一直没时间好好研究,直接插上就用了.内网速度一直维持在10M-15M左右.今年618换了款千兆路由器,速度瞬间提升到了50M-70M.线缆用的都是五类,心中就产生疑问:如果换成超五类线或者六类线,性能是不是能再提高点??于是网上搜到一个哥们十分专业的回答,忍不住粘下来跟大家共享: 原帖地址:http://we.poppur.com/thread-1098485-1-1.html 5类线的传输频率标准是100MHz  超5一般是125MHz  6类标准

小结在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?

Java编程思想中的一段话: 当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元).每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java).每个编译单元只能有一个public类,否则编译器就不会接受.如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持. 理解: 每编

黑马程序员--Foundation框架之--NSArray类以及它的子类NSMutableArray类

今天我们继续来看一下Foundation框架中的NSArray类和 NSMutableArray类,NSArray类 是不可变的,NSMutableArray类是可变的. 一.NSArray类 NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型.结构体放入到数组中得话,需要通过NSNumber/NSValue进行数据的封装 同时不能在NSArray中存储nil // // main.m // 16_NSArray // // Created by waterfoxjie

类的生命周期(下)类的初始化【转】

上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后就开始了类的初始化.在类的初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋值,在程序中,类的初始化有两种途径:(1)在变量的声明处赋值.(2)在静态代码块处赋值,比如下面的代码,a就是第一种初始化,b就是第二种初始化 [html] view plaincopyprint? public

初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化

序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用BinaryFormatter类进行序列化和反序列化● 使用ISerializable接口自定义序列化过程● 使用XmlSerializer类进行序列化和反序列化 □ 使用BinaryFormatter类进行序列化和反序列化 首先把需要序列化的类打上[Serializable]特性,如果某个字段不需