您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > windows编程技术12文档与视图
1第12章文档与视图MFC提供了将应用程序的数据与显示分开的文档-视图结构,它为应用程序提供了统一的框架,参见图12-1。对应的MFC应用程序的有关类及其MFC基类,可以参见2.2.5节的图2-9和图2-10。MFC的文档-视图结构是MVC模式的一种部分实现。12.1MVCMVC是一种软件架构模式,通过分解程序的不同功能,达到降低程序设计的复杂度、利于程序员专业分工、简化程序的维护和扩展的目的。MVC是1979年挪威计算机科学家TrygveReenskaug在Xerox(施乐公司)PARC(PaloAltoResearchCenter,帕洛阿尔托研究中心)工作时,为(历史上第二个面向对象程序设计语言和第一个真正的集成开发环境)SmallTalk提出的。12.1.1概念MVC(Model-View-Controller,模型—视图—控制器)是一种软件架构模式,它把软件系统分为如下三个基本部分(参见图12-2):模型(Model)——数据(库)。视图(View)——图形界面(显示/表示)。控制器(Controller)——程序功能(算法)。MVC模式的目的是实现一种动态的程序设计,简化对程序的后续修改和扩展,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的功能,专业人员可以通过自身的专长进行分组合作:数据库专家利用“模型”进行数据管理和数据库设计、界面设计人员利用“视图”进行图形界面设计、而程序员则利用“控制器”编写程序应有的图12-1SDI应用程序中的对象图12-2MVC模式的关系图2功能(实现算法等等)。12.1.2层次模型(Model,数据模型)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权利,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。(比较:观察者模式(软件设计模式))视图(View)视图层能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据模型上的改变。12.1.3实现SmallTalk1980年MVC最早被应用于XeroxPARC的面向对象、动态类型、自反射的编程语言SmallTalk-80环境中,运行在首个具有GUI的原型计算机Alto(男高音)上。MacApp1985年Apple将MVC用于其推出的MacOS系统的面向对象的应用程序框架MacApp中,这是MVC首次在商用产品中的实际应用。MFC1993年2月微软在其随VisualC++1.0推出的MFC2.0中,引入了文档-视图(Document/View)架构,它也是一种对于MVC的早期部分实现。MFC将程序分成视图(View)和文档(Document)两大类,其中的CDocument对应MVC中的数据模型(Model),CView相当于MVC中的视图+控制(View+Controller),再加上应用程序类CWinApp,合成三大项。但是MFC基本上是一个失败的MVC作品。由于MFC对Document/View的定义过于模糊,未将Controller(消息映射)部份取出,因此Controller既可置入View也可置入Document,3但不管置入哪一方面,都会与View或Document绑死而缺乏弹性。JavaEE——Struts1999年12月Sun推出的JavaEE(JavaEnterpriseEdition,Java企业版,原来叫J2EE)和其他的各种框架不一样,它为模型对象(ModelObjects)定义了一个规范。典型例子是由CraigMcClanahan于2000年5月所开发的开源JavaEE轻型Web应用框架ApacheStruts。视图(View)——在JAVAEE应用程序中,视图(View)可能由JSP(JavaServerPage,爪哇服务器网页)承担。生成视图的代码则可能是Servlet的一部分,特别是在客户端服务端交互的时候。控制器(Controller)——JAVAEE应用中,控制器可能是一个Servlet。模型(Model)——模型则是由一个实体Bean来实现。.NET——WindowsForms2002年2月微软所推出的.NET框架中还包含有WinForms(视窗窗体),这个针对视图(View)和控制器(Controller)的模式已被很好地定义,而模型(Model)则留给开发者去设计。视图(View)——由Form或者Control类继承来的一个类处理视图的职责。在WinForm这个例子中视图和控制器被编译在同一个类中,这个和ASP.NET不同。控制器(Controller)——控制器的职责被分割成三部分。事件(Event)的产生和传输是操作系统的一部分。在.Net框架中Form和Control类将不同的事件转发给相应的事件处理器。而事件的处理则在分离的代码中实现。模型(Model)——就像ASP.NET一样,WinForm不严格需要一个模型。开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。也就是说用模型来包含商业逻辑和数据访问。.NET——ASP.NET2002年2月微软随.NET推出了ASP.NET,针对视图(View)和控制器(Controller)的模式并没有被很好地定义,模型(Model)也留给开发者去设计。视图(View)——ASPX和ASCX文件被用来处理视图的职责。在这个设计中视图实际上是从控制器继承而来。这个和Smalltalk的实施有所不同,在Smalltalk中不同的类都有指针互相指向对方。4控制器(Controller)——控制器的职责被分割成两部分。事件(Event)的产生和传输是框架的一部分,更明确的说是Page和Control两个类。而事件的处理则在分离的代码中实现。模型(Model)——ASP.NET不严格需要一个模型。开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。但用模型来包含商业逻辑和数据访问是可实现的。2009年4月9日微软推出了ASP.NETMVC1.0,它在ASP.NET3.5运行库之上提供了一个新的MVC架构。此架构为Web应用程序文件夹(folder)结构定义了一个特别模式,并提供了一个控制器基类来处理“动作(actions)”请求。ASP.NETMVC2.0也已于2010年3月12日推出,它建立在ASP.NET3.5SP1运行库之上,并且被集成进了2010年4月12日推出的.NET框架4.0和VisualStudio2010之中。12.2文档-视图体系文档(document)对应于用户的数据(可以是文本、数值、图像、声音、视频等),它可以从磁盘文件中读入,也可写入磁盘文件,用户还可以创建、修改和管理这些数据。文档对应的MFC类为CDocument。视图(view)是一种窗口对象,对应于(主/子)框架窗口的客户区,它负责在屏幕和打印机上显示和输出数据,为用户提供观察、选择、编辑文档数据的交互界面(参见图12-3)。视图对应的MFC类为CView。文档-视图结构有两种主要的方式:SDI(SingleDocumentInterface,单文档界面)和MDI(MultipleDocumentInterface,多文档界面)。从MFC7.0起新增加了一种MTDI(MultipleTop-levelDocumentInterface,多顶级文档界面),参见图11-4。SDI传统子窗口MDI选项卡式MDIMTDI图11-4不同的文档界面图12-3文档与视图5SDI应用程序只有一个框架窗口(类)和一个视图窗口(对应于框架窗口的客户区),且只有一个文档类,每次只能打开一个文档。这里的文档和视图一般是一一对应的。例如Windows中的记事本、写字板和画图等软件,是典型的SDI应用程序。MDI应用程序有一个主框架窗口(类),可有任意多个子框架窗口和对应的视图客户区窗口,也可有多个文档类,可以同时打开多个文档/窗口。这里,每个视图对应于一个文档,而每个文档则可对应于多个视图,参见图12-5。例如Word2000和IE8,分别是传统和选卡式MDI应用程序。MTDI类似于MDI,只是MDI中的每个文档视图窗口都是主框架窗口的子窗口(只能位于主框架窗口的客户区内)。而MTDI的文档视图窗口都是顶层窗口,位于主框架窗口之外。例如新版Word和老版IE,就是典型的MTDI应用程序。应用程序的文档-视图结构种类,可以在创建MFC应用程序时,在“MFC应用程序向导”对话框的“应用程序类型”页中设置(默认为MDI),在该对话框页中还可以选择是否具有“文档/视图结构支持”(默认是选中的),参见图12-6。图12-6MFC应用程序向导中的“文档/视图结构支持”选项图12-5一个文档可对应多个视图612.2.1文档模板类文档、框架窗口与视图通过文档模板联系在一起,MFC的文档模板类为CDocTemplate。对SDI与MDI,它有两个对应的派生类CSingleDocTemplate与CMultiDocTemplate,在MFC功能包中又增加了多文档模板的扩展类CMultiDocTemplateEx,参见图12-7。它们的构造函数的参数都一样:C[Single|Multi]DocTemplate[Ex](//文档模板构造函数UINTnIDResource,//文档类型的资源IDCRuntimeClass*pDocClass,//派生文档类对象的指针CRuntimeClass*pFrameClass,//[派生]框架窗口类对象的指针CRuntimeClass*pViewClass//派生视图类对象的指针);CWinApp类创建文档模板的操作分两步进行,首先用文档模板类的构造函数创建一个SDI或MDI文档模板的实例,然后调用CWinApp类的成员函数AddDocument将该模板添加到应用程序的模板列表中。创建文档模板的操作,一般在派生应用程序类的InitInstance成员函数中完成。例如(SDI):BOOLCDrawApp::InitInstance(){……//注册应用程序的文档模板。文档模板//将用作文档、框架窗口和视图之间的连接CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CDrawDoc),RUNTIME_CLASS(CMainFrame),//自定义MDI子框架RUNTIME_CLASS(CDrawView));if(!pDocTemplate)returnFALSE;图12-7文档模板类的层次结构7AddDocTemplate(pDocTemplate);……}其中,RUNTIME_CLASS宏返回一个指向CRunTimeClass类的指针:CRuntimeClass*RUNTIME_CLASS(class_name)又例如(MDI):BOOLCImageApp::InitInstance(){……//注册应用程序的文档模板。文档模板//将用作文档、框架窗口和视图之间的连接CMultiDocTemplate*pDocTemplate;pDocTemplat
本文标题:windows编程技术12文档与视图
链接地址:https://www.777doc.com/doc-6158333 .html