单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,MFC文档视图结构,MFC文档视图结构,1,一、文档视结构概述,思考:一个排序小程序的编写过程,框架?,应用层、显示层、存储层,Observer模式,文档视结构是程序框架中,应用层,(数据处理层)与数据,显示层,之间的一种,数据交换关系,。其主要思想是设计模式中的Observer模式。把,数据处理和显示有机分离,合理交互,。,在MFC中,则更多代表了一种,程序框架模式,。,一、文档视结构概述思考:一个排序小程序的编写过程,框架?,2,MFC,库支持:,Single Document Interface,Multiple-Document Interface,一、文档视结构概述,MFC库支持:一、文档视结构概述,3,SDI,和,MDI,主要差别(用户的角度),SDI,的应用程序只有一个窗口,每次只能读写一个文件或文档。,例如:,Windows,的,notepad,MDI,的应用程序每次可以读写多个文件或文档,可以同时对多个文档进行操作,可以有多个子窗口。,例如:,Windows,的,Word,一、文档视结构概述,SDI和MDI主要差别(用户的角度)一、文档视结构概述,4,SDI和MDI主要差别(程序员角度),SDI,不需要生成,CChildFrame,类,SDI,应用程序的,CMainFrame,类的基类为,CFrameWnd,MDI,应用程序的,CMainFrame,类的基类为,CMDIFrameWnd,一、文档视结构概述,SDI和MDI主要差别(程序员角度)一、文档视结构概述,5,二、基于文档视结构的程序框架构成,文档处理类,应用层,负责应用程序的数据处理、管理和存储中心。,视图显示类,显示层,从文档类中取数据、显示数据给用户;,接受用户对文档中数据的编辑和修改,并反馈给文档类;,框架管理类,独立界面管理工作,为应用程序的用户界面提供框架窗口,它是应用程序的主窗口,负责管理其包容的窗口。,应用程序类,管理应用程序本身,负责和OS进行交互(获取或发送消息等),二、基于文档视结构的程序框架构成文档处理类 应用层,6,二、基于文档视结构的程序框架构成,文档,class CDocument;,视图,class CView;,框架类,class CFrameWnd;/standard SDI Main Frame,class CMDIFrameWnd;/stardard MDI Main Frame,class CMDIChildWnd;/standard MDI child Frame,应用程序类,class WinApp,二、基于文档视结构的程序框架构成文档,7,二、基于文档视结构的程序框架构成,SDI,CDocument,CView,CWinApp,CMainFrame-派生自CFrameWnd,二、基于文档视结构的程序框架构成SDI,8,二、基于文档视结构的程序框架构成,MDI,CDocument,CView,CWinApp,CMainFrame-派生自CFrameWnd:主框架类,CChildFrame派生自CMDIChildWnd:子框架类,二、基于文档视结构的程序框架构成MDI,9,三、文档视结构的运行机制(方式),1)视图类调用,GetDocument,成员函数获得相关联的文档对象指针,从文档中读取数据。,2)视图把数据显示在屏幕上,用户交互,数据修改。,3)视图将经过修改的数据传递给文档对象,进行数据更新。,三、文档视结构的运行机制(方式)1)视图类调用GetDocu,10,四、文档视结构中各类的重要函数,几个重要的函数,CView类的OnInitialUpdate,CView类的OnDraw,CView类的GetDocument,CDocument类的UpdateAllViews,CView类的OnUpdate,四、文档视结构中各类的重要函数几个重要的函数,11,CView类:OnInitialUpdate,当视图第一次与一个文档相关联,在视图尚未显示前,调用该函数。CView基类中的成员函数OnInitialUpdate()的作用就是调用OnUpdate()函数。,可以用派生类的OnInitialUpdate()函数对视图对象进行初始化。当应用程序启动时,应用程序框架调用了OnCreate()函数之后,会立刻调用OnInitialUpdate()函数。,四、文档视结构中各类的重要函数,CView类:OnInitialUpdate四、文档视结构,12,CView:OnDraw,应用程序几乎所有的绘制工作都是在视图类的OnDraw()函数中完成的。每次当视窗被重新绘制时,应用程序框架都要调用函数OnDraw()。,当用户改变了窗口尺寸,或者窗口恢复了以前被遮盖的部分,或者当应用程序改变了窗口的数据时,窗口都需要被重新绘制。,视图类所继承的Invalidate或InvalidateRect成员调用后会触发对函数OnDraw的调用。,四、文档视结构中各类的重要函数,CView:OnDraw四、文档视结构中各类的重要函数,13,CView:GetDocument,一个视图对象只有一个与之相联系的文档对象,CView及其派生类只需调用GetDocument()函数就可以取得CDocument类的对象指针,从而用此指针来访问文档类中的所有可见的数据和文档类公有成员函数。,四、文档视结构中各类的重要函数,CView:GetDocument一个视图对象只有一个与之,14,CDocument:UpdateAllViews,一个文档对象可以有多个视图对象与之对应,所以当文档数据发生了改变,则必须要通知所有的视图对象,以便它们能对所显示的数据进行相应的更新。UpdateAllViews()函数调用每个视图的成员函数OnUpdate()对相应视图进行更新。,四、文档视结构中各类的重要函数,CDocument:UpdateAllViews四、文档视,15,CView:OnUpdate,当应用程序调用了CDocument类的UpdateAllViews()函数时,应用程序框架就会相应的调用此函数。,通常在派生视图类中的OnUpdate()函数要对文档进行访问,读取文档的数据,然后再对视图的数据成员或控制进行更新,以便反映出文档的变化。,四、文档视结构中各类的重要函数,CView:OnUpdate四、文档视结构中各类的重要函数,16,一个简单的数据分析软件,需求:,1、处理数据源格式,用户提供一个数据文件,文件第一行有两个数据,分别表示数据文件每行有多少个数据(列)以及数据文件共有多少行。,文件从第二行开始表示具体的数据,数据之间以一个空格隔开,数据均在0255之间。,一个简单的数据分析软件需求:,17,MFC文档视图结构课件,18,一个简单的数据分析软件,2、功能要求,能够读入一个数据文件,能够对该数据文件中的数据进行统计分析,前期只需要计算出这些数据的直方图,并在软件中以二维图形的方式显示出来;,能够对每个数据以该数据值为颜色,以该数据行、列为坐标在屏幕上画出该数据点。,一个简单的数据分析软件2、功能要求,19,一个简单的数据分析软件关键问题,1、文件读取,文件读取采用C+中的文件流技术进行数据文件中的数据读取,。,ifstream dataFile(“1.dat”,ios:in|ios:nocreate);,dataFile a;,dataFile b;,其他方法,CFile、CArchive串行化等,一个简单的数据分析软件关键问题1、文件读取,20,一个简单的数据分析软件,2、直方图计算算法,假如有一个有16个数的数列:1 1 1 3 2 1 4 5 3 2 4 5 5 4 3 3,这些数都在05之间。,数0,1,2,3,4,5在这个数列中出现的次数就是这个数列的统计直方图。,思考:,(1)这些数出现的概率呢?,(2)计算机如何实现求直方图,Int Data16 存数列;hist5存05每个整数出现的次数。,实现:出现一个数i,就对histi加1,For(int I=0;I m_pMainWnd为框架窗口指针;,文档类,调用CDocument:GetFirstViewPosition,CDocument:GetNextView来遍历所有和文档关联的视图,视图类,调用CView:GetDocument 得到对应的文档指针,调用CView:GetParentFrame 获取框架窗口,框架窗口,调用CFrameWnd:GetActiveView 获取当前得到当前活动视图指针,调用CFrameWnd:GetActiveDocument 获取附加到当前视图的文档指针,附录从该对象如何访问其他对象全局函数调用全局函数AfxGet,26,