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