win5-6MFC视图结构课件_第1页
win5-6MFC视图结构课件_第2页
win5-6MFC视图结构课件_第3页
win5-6MFC视图结构课件_第4页
win5-6MFC视图结构课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC文档视图结构一、文档视结构概述思考:一个排序小程序的编写过程,框架?应用层、显示层、存储层 Observer模式文档视结构是程序框架中应用层(数据处理层)与数据显示层之间的一种数据交换关系。其主要思想是设计模式中的Observer模式。把数据处理和显示有机分离,合理交互。在MFC中,则更多代表了一种程序框架模式。一、文档视结构概述MFC库支持:SingleDocumentInterfaceMultiple-DocumentInterface一、文档视结构概述SDI和MDI主要差别(用户的角度) SDI的应用程序只有一个窗口,每次只能读写一个文件或文档。例如:Windows的notepad MDI的应用程序每次可以读写多个文件或文档,可以同时对多个文档进行操作,可以有多个子窗口。例如:Windows的Word一、文档视结构概述SDI和MDI主要差别(程序员角度)SDI不需要生成CChildFrame类SDI应用程序的CMainFrame类的基类为CFrameWnd

MDI应用程序的CMainFrame类的基类为CMDIFrameWndDOCUMENT/VIEW架构(1)·MFC引入了"文档/视图"结构的概念,理解这个结构是编写基于MFC编写复杂VisualC++程序的关键。DOCUMENT/VIEW架构(2)·在此模型中,MFC文档对象将数据读入或写入永久存储区。该文档还可能提供到数据所驻留的任何位置(如在数据库中)的接口。一个单独的视图对象可管理数据显示,包括从在窗口中呈现数据到用户选择和数据编辑。该视图从文档获取显示数据,并将任何数据更改传递回文档。MVC架构(1)·MVC(Model-View-Controller,模型—视图—控制器模式)是软件工程中的一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。MVC架构(2)其目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外此模式通过对复杂度的简化使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:*控制器-负责转发请求,对请求进行处理。*视图-界面设计人员进行图形界面设计。 *模型-程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。MVC和DOCUMENT/VIEW的关系Document/View架构是MVC的一种变体,因为在几种GUI平台中,窗口显示和事件处理是交织在一起的。MFCDocument/View架构是 期对于MVC的实现,MFC將程式分成View以及Document两大类,其中的Document对应MVC中的Model,View相当于MVC中的View+Controller。DOCUMENT/VIEW的优势在需要同一文档的多个视图时,例如同时需要电子数据表格和图表视图。文档/视图模型使一个单独的视图对象得以表示每个数据视图,而对所有视图通用的代码(例如计算引擎)可以驻留在文档中。文档还承担在每次数据更改时更新所有视图的任务。MFC文档/视图结构使支持多视图、多文档类型、拆分窗口和其他有价值的用户界面功能变得容易。二、基于文档视结构的程序框架构成//standard

SDI

Main

Frame//stardard

MDI

Main

Frame//

standard

MDI

child

Frame文档class

CDocument;视图class

CView;框架类class

CFrameWnd;class

CMDIFrameWnd;class

CMDIChildWnd;应用程序类class

WinApp二、基于文档视结构的程序框架构成SDICDocumentCViewCWinAppCMainFrame--派生自CFrameWnd二、基于文档视结构的程序框架构成MDICDocumentCViewCWinAppCMainFrame--派生自CFrameWnd:主框架类CChildFrame—派生自CMDIChildWnd:子框架类三、文档视结构的运行机制(方式)1)视图类调用GetDocument成员函数获得相关联的文档对象指针,从文档中读取数据。2)视图把数据显示在屏幕上 用户交互 数据修改。3)视图将经过修改的数据传递给文档对象,进行数据更新。CDOCTEMPLATE(1)CDocTemplate(或CSingleDocTemplate或CMultiDocTemplate)支持一个对象,该对象协调给定类型的一个或多个现有文档并对创建该类型的正确文档、视图和框架窗口对象进行管理。CDocTemplate是一个抽象基类,它定义了文档模板的基本处理函数接口。对一个单文档界面程序,需使用单文档模板类CSingleDocTemplate,而对于一个多文档界面程序,需使用多文档模板类CMultipleDocTemplate。CDOCTEMPLATE(2)·文档模板挂接了文档、视图和框架窗口,使得它们得以互相关联。通过文档模板,程序确定了创建或打开一个文档时,以什么样的视图和框架窗口来显示。文档模板依靠保存相互对应的文档、视图和框架窗口的CRuntimeClass对象指针来实现上述挂接,这就是文档模板类中的成员变量m_pDocClass、m_pFrameClass、m_pViewClass的由来。CDOCUMENT(1)·CDocument(或COleDocument)类支持用于存储或控制程序数据的对象,并为程序员定义的文档类提供基本功能。在"文档/视图"架构的MFC程序中,文档是一个CDocument派生对象,它负责存储应用程序的数据,并把这些信息提供给应用程序的其余部分。CDocument类对文档的建立及归档提供支持并提供了应用程序用于控制其数据的接口。CDOCUMENT(2)文档表示数据单元,用户一般用“文件”菜单上的“打开”命令打开它,并用“文件”菜单上的“保存”命令保存它。一个文档可以有多个视图,每一个文档都维护一个与之相关视图的链表(CptrList类型的m_viewList实例)。CDocument::AddView将一个视图连接到文档上,并将视图的文档指针指向该文档。文档与视图进行通信的方式是调用文档类的UpdateAllViews函数。CVIEW(1)·CView(或它的许多派生类之一)为程序员定义的视图类提供基本功能。视图被附加到文档并在文档和用户之间充当中介:视图在屏幕上呈现文档的图像并将用户输入解释为对文档的操作。视图还为打印和打印预览呈现图像。CVIEW(2)在MFC"文档/视图"架构中,CView类是所有视图类的基类,它提供了用户自定义视图类的公共接口。在"文档/视图"架构中,文档负责管理和维护数据;而视图类则负责如下工作:从文档类中将文档中的数据取出后显示给用户;接受用户对文档中数据的编辑和修改;将修改的结果反馈给文档类,由文档类将修改后的内容保存到磁盘文件中。文档负责了数据真正在永久介质中的存储和读取工作,视图呈现只是将文档中的数据以某种形式向用户呈现,因此一个文档可对应多个视图。CVIEW(3)·CView类首先要维护文档与视图之间的关联,它通过CDocument*m_pDocument保护性成员变量记录关联文档的指针,并提供CView::GetDocument接口函数以使得应用程序可得到与视图关联的文档。而在CView类的析构函数中,需将对应文档类视图列表中的本视图删除。CVIEW(4)CView中地位最重要的函数是virtualvoidOnDraw(CDC*pDC)=0;CView是一个纯虚基类。这个函数必须被重载,它通常执行如下步骤:以GetDocument()函数获得视图对应文档的指针;读取对应文档中的数据;显示这些数据。CVIEW(5)CView::OnUpdate函数在文档的数据被改变的时候被调用(即它被用来通知一个视图的关联文档的内容已经被修改),它预示着我们需要重新绘制视图以显示变化后的数据。其中的Invalidate(TRUE)将整个窗口设置为需要重绘的无效区域,它会产生WM_PAINT消息,这样OnDraw将被调用。假如文档中的数据发生了变化,必须通知所有链接到该文档的视图,这时候文档类的UpdateAllViews函数需要被调用。CFRAMEWND(1)在MFC中,文档是真正的数据载体,视图是文档的显示界面,对应同一个文档,可能存在多个视图界面,我们需要另外一种东西来将这些界面管理起来,这个东西就是框架。CFrameWnd(或其变体之一)支持在文档的一个或多个视图周围提供框架的对象。CFRAMEWND(2)MFC创造框架类的初衷在于:把界面管理工作独立出来!框架窗口为应用程序的用户界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗口。一个应用程序启动时会创建一个最顶层的框架窗口。MFC提供两种类型的框架窗口:单文档窗口SDI和多文档窗口MDI(你可以认为对话框是另一种框架窗口)。单文档窗口一次只能打开一个文档框架窗口,而多文档窗口应用程序中可以打开多个文档框架窗口,即子窗口(ChildWindow)。这些子窗口中的文档可以为同种类型,也可以为不同类型。模板、文档、视图、框架的关系(1)文档保留该文档的视图列表和指向创建该文档的文档模板的指针;文档至少有一个相关联的视图,而视图只能与一个文档相关联。(2)视图保留指向其文档的指针,并被包含在其父框架窗口中;(3)文档框架窗口(即包含视图的MDI子窗口)保留指向其当前活动视图的指针;(4)文档模板保留其已打开文档的列表,维护框架窗口、文档及视图的映射;(5)应用程序保留其文档模板的列表。消息流动机制在基于"文档/视图"架构的MFC程序中,用户消息(鼠标、键盘输入等)会先发往视图,如果视图未处理则会发往框架窗口。所以,一般来说,消息映射宜定义在视图中。另外,如果一个应用同时拥有多个视图而当前活动视图没有对消息进行处理则消息也会发往框架窗口。完整的WM_COMMAND消息的处理顺序是"视图――文档――框架窗口――应用"。四、文档视结构中各类的重要函数几个重要的函数CView类的OnInitialUpdateCView类的OnDrawCView类的GetDocumentCDocument类的UpdateAllViewsCView类的OnUpdate四、文档视结构中各类的重要函数CView类::OnInitialUpdate 当视图第一次与一个文档相关联,在视图尚未显示前,调用该函数。CView基类中的成员函数OnInitialUpdate()的作用就是调用OnUpdate()函数。 可以用派生类的OnInitialUpdate()函数对视图对象进行初始化。当应用程序启动时,应用程序框架调用了OnCreate()函数之后,会立刻调用OnInitialUpdate()函数。四、文档视结构中各类的重要函数CView::OnDraw应用程序几乎所有的绘制工作都是在视图类的OnDraw()函数中完成的。每次当视窗被重新绘制时,应用程序框架都要调用函数OnDraw()。当用户改变了窗口尺寸,或者窗口恢复了以前被遮盖的部分,或者当应用程序改变了窗口的数据时,窗口都需要被重新绘制。视图类所继承的Invalidate或InvalidateRect成员调用后会触发对函数OnDraw的调用。四、文档视结构中各类的重要函数CView::GetDocument 一个视图对象只有一个与之相联系的文档对象,CView及其派生类只需调用GetDocument()函数就可以取得CDocument类的对象指针,从而用此指针来访问文档类中的所有可见的数据和文档类公有成员函数。四、文档视结构中各类的重要函数CDocument::UpdateAllViews一个文档对象可以有多个视图对象与之对应,所以当文档数据发生了改变,则必须要通知所有的视图对象,以便它们能对所显示的数据进行相应的更新。UpdateAllViews()函数调用每个视图的成员函数OnUpdate()对相应视图进行更新。四、文档视结构中各类的重要函数CView::OnUpdate当应用程序调用了CDocument类的UpdateAllViews()函数时,应用程序框架就会相应的调用此函数。通常在派生视图类中的OnUpdate()函数要对文档进行访问,读取文档的数据,然后再对视图的数据成员或控制进行更新,以便反映出文档的变化。附录从该对象如何访问其他对象全局函数调用全局函数AfxGetApp可以得到CWinApp应用类指针应

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论