收藏 分享(赏)

第4章 文档与视图教案.doc

上传人:cjc2202537 文档编号:1211438 上传时间:2018-06-18 格式:DOC 页数:5 大小:25.50KB
下载 相关 举报
第4章 文档与视图教案.doc_第1页
第1页 / 共5页
第4章 文档与视图教案.doc_第2页
第2页 / 共5页
第4章 文档与视图教案.doc_第3页
第3页 / 共5页
第4章 文档与视图教案.doc_第4页
第4页 / 共5页
第4章 文档与视图教案.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、第 4 章 文档与视图教案MFC 提供了将应用程序的数据与显示分开的文档/ 视图结构,它为应用程序提供了统一的框架.如正在运行中的 SDI 应用程序中的对象 文档视图结构中的各种对象及其创建与关系MFC 的文档/视图结构是 MVC(Model-View-Controller,模型视图控制器)模式的一种实现.4.0 MVCMVC 是一种软件架构模式,通过分解程序的不同功能,达到降低程序设计的复杂度、利于程序员专业分工、简化程序的维护和扩展的目的.MVC 是由挪威计算机科学家 Trygve Reenskaug,于 1979 年在 Xerox PARC 工作时,为( 面向对象程序设计语言的鼻祖)Sm

2、allTalk 提出的.1.概念MVC(Model-View-Controller,模型视图控制器) 是一种软件架构模式,它把软件系统分为三个基本部分:模型(Model) 数据(库)视图(View) 图形界面控制器(Controller) 程序功能 (算法)模型视图控制器模式的关系图模型视图控制器模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外此模式通过对复杂度的简化,使程序结构更加直观.软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的功能,专业人员可以通过自身的专长进行分组合作:数据库专家利用“模型“进行数据管理

3、和数据库设计、界面设计人员利用“视图 “进行图形界面设计、而程序员则利用 “控制器“编写程序应有的功能( 实现算法等等).2.层次模型(Model,数据模型) 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法 .“模型“有对数据直接访问的权利,例如对数据库的访问.“ 模型 “不依赖“视图“ 和“控制器“,也就是说,模型不关心它会被如何显示或是如何被操作.但是模型中数据的变化一般会通过一种刷新机制被公布.为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变.(比较:观察者模式(软件设计模式)视图(View) 视图层能够实现数据有目的

4、的显示(理论上,这不是必需的 ).在视图中一般没有程序上的逻辑.为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册.控制器(Controller) 控制器起到不同层面间的组织作用,用于控制应用程序的流程.它处理事件并作出响应.“事件“ 包括用户的行为和数据模型上的改变.3.实现SmallTalk1980 年 MVC 最早被应用于施乐公司(Xerox)PARC(Palo Alto Research Center,帕洛阿尔托研究中心)的面向对象、动态类型、自反射的编程语言 SmallTalk-80 环境中,运行在首个具有GUI 的原型计算机

5、Xerox Alto(男高音) 上.MacApp1985 年 Apple 将 MVC 用于其推出的 Mac OS 系统的面向对象的应用程序框架 MacApp 中,这是 MVC 首次在商用产品中的实际应用.MFC1993 年 2 月微软在其推出的 Visual C+ 1.0 的 MFC 2.0 中,也引入了文档/视图(Document / View)架构 ,它也是一种对于 MVC 的早期实现.MFC 将程序分成 CView 以及 CDocument 两大类,其中的 CDocument 对应 MVC 中的 Model,CView 相当于 MVC 中的 View+Controller,再加上 CWi

6、nApp 类,合成三大项.但是 MFC 基本上是一个失败的 MVC 作品.由于 MFC 对 Document/View 的定义过于模糊,未将 Controller(MessageMap)部份取出,因此 Controller 既可置入 View 也可置入 Document,但不管置入哪一方面,都会与 View 或 Document 绑死,没有弹性 .Java EEStruts1999 年 12 月 Sun 推出的 Java EE(Java Enterprise Edition,Java 企业版,原来叫 J2EE)和其他的各种框架不一样,它为模型对象(Model Objects)定义了一个规范.典

7、型例子是由 Craig McClanahan 于 2000 年 5 月开发的开源 Java EE 轻型 Web 应用框架 Apache Struts.视图(View) 在 JAVA EE 应用程序中,视图(View)可能由 JSP(Java Server Page,爪哇服务器网页)承担.生成视图的代码则可能是 Servlet 的一部分,特别是在客户端服务端交互的时候. 控制器(Controller) JAVA EE 应用中,控制器可能是一个 Servlet. 模型(Model) 模型则是由一个实体 Bean 来实现. .NETWindows Forms2002 年 2 月微软所推出的.NET

8、框架中还包含有 WinForms(视窗窗体),这个针对视图(View)和控制器(Controller)的模式已被很好的定义 ,而模型(Model)则留给开发者去设计.视图(View) 由 Form 或者 Control 类继承来的一个类处理视图的职责.在 WinForm 这个例子中视图和控制器被编译在同一个类中,这个和 ASP.NET 不同. 控制器(Controller) 控制器的职责被分割成三部分.事件(Event)的产生和传输是操作系统的一部分.在.Net 框架中 Form 和 Control 类将不同的事件转发给相应的事件处理器.而事件的处理则在分离的代码中实现.模型(Model) 就

9、像 ASP.NET 一样,WinForm 不严格需要一个模型.开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等.也就是说用模型来包含商业逻辑和数据访问.NETASP.NET2002 年 2 月微软随.NET 推出了 ASP.NET,针对视图(View)和控制器(Controller)的模式并没有被很好地定义,模型(Model)也留给开发者去设计.视图(View)ASPX 和 ASCX 文件被用来处理视图的职责.在这个设计中视图实际上是从控制器继承而来.这个和 Smalltalk 的实施有所不同,在 Smalltalk 中不同的类都

10、有指针互相指向对方.控制器(Controller) 控制器的职责被分割成两部分.事件(Event)的产生和传输是框架的一部分,更明确的说是 Page 和 Control 两个类.而事件的处理则在分离的代码中实现 .模型(Model) ASP.NET 不严格需要一个模型.开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等.但用模型来包含商业逻辑和数据访问是可实现的. 2009 年 4 月 9 日微软推出了 ASP.NET MVC 1.0,它在 ASP.NET 3.5 运行库之上提供了一个新的 MVC 架构.此架构为 Web 应用程序文

11、件夹(folder) 结构定义了一个特别模式,并提供了一个控制器基类来处理“动作 (actions)“请求.4.1 文档/视图体系文档(document) 对应于用户的数据 (可以是文本、数值、图像、声音、视频等 ),它可以从磁盘文件中读入,也可写入磁盘文件,用户还可以定义、修改、管理这些数据.对应的 MFC 类为CDocument.视图(view)是一种窗口对象,对应于框架窗口的客户区 ,它负责在屏幕和打印机上显示和输出数据,为用户提供观察、选择、编辑文档数据的交互界面.对应的 MFC 类为 CView.文档/视图结构有两种主要的方式 :SDI(Single Document Interfa

12、ce,单文档界面) 和MDI(Multiple Document Interface,多文档界面).在.NET 中新添加了一种 MTDI(Multiple Top-level Document Interface,多顶级文档界面).应用程序的文档/视图结构种类 ,可以在创建 MFC 应用程序时,在“MFC 应用程序向导“ 对话框的“应用程序类型 “页中设置 (缺省为 MDI),在该对话框页中还可以选择是否具有 “文档/视图结构支持“(缺省是选中 ).参见下图.SDI 应用程序只有一个框架窗口(类)和一个视图窗口( 对应于框架窗口的客户区),且只有一个文档类,每次只能打开一个文档.这里的文档和视

13、图一般是一一对应的.MDI 应用程序有一个主框架窗口(类), 可有任意多个子框架窗口和对应的视图客户区窗口,也可有多个文档类,可以同时打开多个文档/窗口.这里,每个视图对应于一个文档,而每个文档则可对应于多个视图.MTDI 类似于 MDI,只是 MDI 中的每个文档视图窗口都是主框架窗口的子窗口( 只能位于主框架窗口的客户区内);而 MTDI 的文档视图窗口都是顶层窗口 ,位于主框架窗口之外.SDI MDI MTDI不同的文档界面1.文档模板类文档、框架窗口与视图通过文档模板联系在一起,MFC 的文档模板类为 CDocTemplate.对SDI 与 MDI,它有两个对应的派生类 CSingle

14、DocTemplate 与 CMultiDocTemplate:它们的构造函数的参数都一样:CSingle|MultiDocTemplate 文档模板构造函数UINT nIDResource, / 文档类型的资源 IDCRuntimeClass* pDocClass, / 派生文档类对象的指针CRuntimeClass* pFrameClass, / 派生 框架窗口类对象的指针CRuntimeClass* pViewClass / 派生视图类对象的指针);CWinApp 类创建文档模板的操作分两步进行,首先用文档模板类的构造函数创建一个 SDI或 MDI 文档模板的实例,然后调用 CWinAp

15、p 类的成员函数 AddDocument 将该模板添加到应用程序的模板列表中.创建文档模板的操作一般在派生应用程序类的 InitInstance 成员函数中完成.例如:(SDI)BOOL CDrawApp:InitInstance() / 注册应用程序的文档模板.文档模板/ 将用作文档、框架窗口和视图之间的连接CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME,RUNTIME_CLASS(CDrawDoc),RUNTIME_CLASS(CMainFrame), / 自定义 M

16、DI 子框架RUNTIME_CLASS(CDrawView);AddDocTemplate(pDocTemplate);其中,RUNTIME_CLASS 宏返回一个指向 CRunTimeClass 类的指针:CRuntimeClass* RUNTIME_CLASS( class_name )又例如:(MDI)BOOL CImageApp:InitInstance() / 注册应用程序的文档模板.文档模板/ 将用作文档、框架窗口和视图之间的连接CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_BMPT

17、YPE,RUNTIME_CLASS(CImageDoc),RUNTIME_CLASS(CChildFrame), / 自定义 MDI 子框架RUNTIME_CLASS(CImageView);AddDocTemplate(pDocTemplate);pDocTemplate = new CMultiDocTemplate(IDR_GIFTYPE,RUNTIME_CLASS(CImageDoc),RUNTIME_CLASS(CChildFrame), / 自定义 MDI 子框架RUNTIME_CLASS(CImageView);AddDocTemplate(pDocTemplate);可见一个

18、MDI 应用程序可有多个 MDI 模板,每个 MDI 模板在运行时又可有多个实例(对应于同一模板中同一文档类型/视图类型的多个文档对象/ 视图窗口 ).如下图所示:具有两个文档类型的 MDI 应用程序2.文档类所有用户的文档类都是从文档基类 CDocument 派生的,参见右图.CDocument 类的常用成员函数有:获得视图列表中与本文档关联的第一个视图的位置,该位置可用于 GetNextView 函数:virtual POSITION GetFirstViewPosition( ) const; 返回 rPosition 所指的视图的指针 ,获得下一个本文档关联的视图的位置到 rPosit

19、ion 中:virtual CView* GetNextView( POSITION rPosition ) const;使用 GetFirstViewPosition 与 GetNextView 可遍历文档的所有视图 .const CString GetTitle( ) const; / 返回文档(窗口) 的标题,一般为相关联的文件名virtual void SetTitle( LPCTSTR lpszTitle ); / 设置文档(窗口)的标题const CString GetPathName( ) const; / 返回与文档相关联的文件的路径/ 无关联文件时返回 NULLvirtual

20、 void SetPathName( LPCTSTR lpszPathName, BOOL bAddToMRU = TRUE );/ 设置存取文档的默认路径(与文档( 窗口)的标题), 若 bAddToMRU = TRUE, / 则将该路径添加到最近使用文件(MRU = most recently used)的列表中BOOL IsModified( ); / 判断文档在最后一次存储后是否被修改过/ 若被修改过,则在用户关闭文档窗口或应用程序时,会提示保存文件void SetModifiedFlag( BOOL bModified = TRUE ); / 设置文档在最后一次存储后/ 是否被修改过

21、void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, / 在用户通过视图CObject* pHint = NULL ); / pSender 修改了文档数据后,/ 应调用该函数通知所有与文档相关联的其他视图窗口,/ 若 pSender = NULL,则通知与文档相关联的所有视图窗口/ 该函数会调用每个视图类的 OnUpdate 成员函数/ 一般是在调用 SetModifiedFlag 后调用该函数缺省时,派生的文档类会覆盖其基类 CObject 的如下序列化成员函数virtual void Serialize( CArchive ar

22、);以支持文档的读写.如 void CTestDoc:Serialize(CArchive ar) if (ar.IsStoring(写入(对应于选中“文件“菜单中的“ 保存“项)/ TODO: add storing code herear m_nWidth m_nHeight;else / 读取( 对应于选中“文件“菜单中的“打开“ 项)/ TODO: add loading code herear m_nWidth m_nHeight;注意:在派生应用程序类 C*App 的 InitInstance 成员函数中缺省会调用其成员函数LoadStdProfileSettings(); / Load standard INI file options (including MRU)来支持 MRU (most recently used 最近使用) 文件列表功能 ,其函数原型为void LoadStdProfileSettings( UINT nMaxMRU = _AFX_MRU_COUNT );若 nMaxMRU =0,则不支持 MRU._AFX_MRU_COUNT = 4.例如:LoadStdProfileSettings(2); Lo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 高中教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报