文档视图结构是使用MFC开发基于文档的应用程序的基本框架,最主要的思想是数据的管理和显示分离。使用文档类管理数据,视图类负责数据的显示,结合数据串行化存储机制,使得开发基于文档的应用程序更加方便。
1.文档-视图结构
文档类CDocument负责维护应用程序所需要的数据,提供一系列可对这些数据进行操作的方法,并且能够为视图提供所需要的数据。视图类CView拥有窗口的客户区域、负责显示文档数据、接收用户输入,提供文档与用户的通信。
单文档与多文档:
使用AppWizard创建SDI与MDI的过程相似,主要区别是创建SDI时不生成CChildFrame类,CMainFrame类的基类为CMainWnd;而在创建MDI时会生成两个框架类,一个是CMainFrame类,由CMDIFrameWnd类派生而来,另一个是CChildFrame类,由CMDIChildWnd类派生而来。
在SDI的CMainFrame对象不但构成了应用程序框架,也包含了视图对象。在MDI中,CMainFrame对象是在应用程序类的InitInstance中被创建,而视图则被包含在CChildFrame对象中。
单文档(SDI)应用程序在一个主框架上只有一个子框架窗口,多文档(MDI)应用程序在一个主框架上可以有多个子框架窗口。
文档与视图体系:
一个文档可以对应于多个视图,而一个视图只能唯一的对应一个文档。文档与视图的结构优势在于数据的管理与显示分离,数据总是要以一定的结构来存储,而视图负责数据呈现。数据往往有多种呈现方式,例如一份报表,可以用表格形式呈现,也可以用图表形式呈现。根据不同的需求以不同的形式呈现,这就是视图的特性。
在使用文档视图体系开发应用程序过程中,涉及的不仅仅是文档与视图。总体来说,涉及4个部分:文档模板、文档、视图和框架窗口。
一个文档可以与多个视图关联,每一个视图仅仅是与其相关联文档数据的一种表现形式。MFC的CView类是所有视图类的基类,主要有两大功能:
(a)将与其相关联文档的数据呈现给用户。
(b)接受用户对数据的修改,并反馈给文档。
在文档视图体系中,文档负责数据的管理,视图负责数据的显示,框架窗口负责管理这些界面。框架窗口有两种模式:当文档窗口(SDI)和多文档窗口(MDI)。在SDI环境下,同时最多只能打开一个框架窗口,而在MDI环境下则没有这个限制。
CSingleDocTemplate
CObject |
└CCmdTarget |
└CDocTemplate |
└CSingleDocTemplate |
· | 一个从CDocument派生而来的文档类。 |
· | 一个视类,用来显示来自上面提到的文档类的数据。你可以从CView,CScrollView,CFormView,或CEditView派生这个类。(你也可以直接使用CEditView。) |
· | 一个框架窗口类,用来包容视。对于一个SDI文档模板,你可以从CFrameWnd派生这个类;如果你不需要定制主框架窗口的行为,你可以直接使用CFrameWnd,而不派生你自己的类。 |
CMultiDocTemplate
CObject |
└CCmdTarget |
└CDocTemplate |
└CMultiDocTemplate |
· | 从CDocument派生的文档类。 |
· | 显示上面列出文档类数据的视图类。可以从CView, CScrollView, CFormView,或 CEditView派生该类(也可以直接使用CEditView)。 |
· | 包含视图的框架窗口类。对于MDI文档模板,可以从CMDIChildWnd中派生该类,或者若不必定制文档框架窗口的行为,可以直接使用CMDIChildWnd而不必派生自己的类。 |