Document-View-Frame
来源:互联网 发布:淘宝可以做免单活动吗 编辑:程序博客网 时间:2024/06/08 13:22
Document
Document在MFC的CDocument里面被实例化. CDocument本身并无实际用途,它只提供一个空壳.当我们开发自己的程序时,应该从CDocument派生一个属于自己的Document类,并且在类中声明一些成员变量,用以承载(容纳)数据.然后再(至少)改写专门负责文件读写操作的Serialize函数.事实上,AppWizard为我们把空壳都准备好,
由于CDocument派生自CObject,所以它就有CObject所支持的一切性质,包括RTTI,Dynamic Creation,Serialization.又由于它也派生CCmdTarget,所以它可以接受来自菜单或工具栏的WM_COMMAND消息。
View
View负责描述(呈现)Document中的数据。
View在MFC的CView中被实例化。CView只提供一个空壳,在开发过程中,应该从CView派生一个属于自己的View类,且在类中(至少)改写专门负责显示数据的OnDraw()函数(针对屏幕)或OnPaint()函数(针对打印机)。其实AppWizard为我们把空壳都准备好了。
由于CView派生自CWnd,所以它可以接受一般的Windows消息(如WM_SIZE,WM_PAINT等等),又由于它也派生自CCmdTarget,因此它也可以接受菜单或工具栏的WM_COMMAND消息。
传统C/SDK程序中,当窗口函数收到WM_APINT时,就调用BeginPaint,获得一个Device Context(DC),然后在这个DC上作画。这个DC代表屏幕装置。在MFC里面,一旦WM_PAINT发生,Framework会自动调用OnDraw函数。
View事实上是个没有边框的窗口。真正出现时,其外围还有一个有边框的窗口,我们称之为Frame窗口。
Document Frame(View Frame)
若我们的程序管理两种不同类型的数据,比如说一个是TEXT,一个是BITMAP,作为程序设计者要为使用者多考虑一些:使用者可能在操作TEXT数据时,换一套TEXT专用的使用界面,在使用者操作BITMAP数据时,也换一套BITMAP界面。这份工作是由Frame窗口负责。
为什么UI的管理不由View直接负责,却要交给Frame窗口。将UI管理机能隔离出来,可以降低彼此之间的依存性,也可以是机能重复使用于各种场合,如SDI,MDI,OLE,In-Place editing(即地编辑)之中。如此一来,View的弹性也会大一些。
Document Template
MFC把Document/View/Frame视为三位一体。每当使用者欲打开(或新增)一份文件,程序应该做出Document,View,Frame各一份。这个“三口组”成为一个运行单元,由所谓的Document Template掌管。MFC中有一个类CDocument负责此事。它又有两个派生类,分别CMultiDocTemplate 和CSingleDocTemplte.
若我们的程序能够处理两种数据类型,必须制造两个Document Template出来,并使用AddDocTemplate函数将它们一一加入系统之中。这和程序是不是MDI并无关系。若程序支持多种数据类型,但却是个SDI,那只不过表示每次只能开启一份文件。
CDocTemplate是个抽象类,定义一些用来处理”Document/View/Frame三口组”的基础函数。
CDocTemplate管理CDocument/CView/CFrameWnd
Document Template管理“三口组“,CWinAPP又来管理Document Template.
File/New File/Open
↓ ↓
CWinApp选择适当的Document Template
↓CMyDoc
构造Document对象
↓ CCwndFrame CMyView
构造Frame窗口对象 构造View对象
↓ ↗ ↓
产生Frame窗口 <———— 产生View窗口
↓
读文件(若是File/Open)
↓
将View窗口初始化
↓
在View中显示资料
注意:构造View对象和产生View窗口的关系。View窗口就是地地道道的Windows窗口,而为了对象管理,MFC把View窗口外包一个专门的C++类别,那就是CView。所以当然是先构造(Construct)一个View对象,再由其构造函数产生(Create)对应的View窗口。
解释CDocTemplate,CDocument,CView,CFrameWnd之间的关系:
# CWinApp拥有一个对象指针:CDocManager *m_pDocManager
# CDocManager拥有一个指针链表CPtrList m_templateList,用来维护一系列的Document Template.一个程序若支持两种文件类型,就应该有两份Document Templates,应用程序应该在CMyViewApp::InitInstance中以AddDocTemplate将这些Document Templates加入到由CDocManager所维护的链表中。
# CDocTemplate拥有三个成员变量,分别持有Document,View,Frame的CRuntimeClass指针,另有一个成员变量m_nIDResource,用来表示此Document显示时应该采用的UI对象。这四份数据应该在CMyWinApp::InitInstance函数构造CDocTemplate时指定,成为构造函数的参数。
# CDocument有一个成员变量CDocTemplate * m_pDocTemplate,回指Document Template;另有一个成员变量CPtrList m_viewList,表示它可以同时维护一系列的Views。
# CFrameWnd有一个成员变量CView * m_pViewActive,指向当前活动的View.
# CView有一个成员变量CDocumnet *m_pDocumnt,指向相关的Document.
- Document-View-Frame
- Document/View/Frame"三口组"深入探讨
- document.frame
- 关于MFC中Document, Frame, View以及Document Template结构关系
- 关于MFC中Document, Frame, View以及Document Template结构关系
- 关于MFC中Document, Frame, View以及Document Template结构关系
- MFC 文档 视图 和 框架 的建立(Document View and Frame Vork)
- C++--MFC的关键类(View,Application,Frame,Document等等)之间访问方法列表
- C++--MFC的关键类(View,Application,Frame,Document等等)之间访问方法列表
- Document(文档)、View(视图)、Frame(框架)、App(应用)之间相互访问
- Document(文档)、View(视图)、Frame(框架)、App(应用)之间相互访问
- 创建frame/view
- 关于view的frame
- view的frame变化
- document-view结构.
- Document/View初理解
- Document-View结构
- Document\View\MainFrame--MessageMap
- Ajax无刷新实现图片切换特效
- css控制打印时强制分页
- Ctfmon.exe 文件
- DBV——DBVerify
- 命令行运行java文件
- Document-View-Frame
- 一个ajax的好网址
- [源码分析]Community Server的MemberRole之Membership深入篇
- Meav《One I Love》
- ASP写的Trojan
- begin MySQL
- 分析xloadtree, 用ajax实现的动态目录树
- export命令
- html页面自动刷新问题