《面向对象的程序设计语言——c++》课件--第7章

上传人:kms****20 文档编号:51255613 上传时间:2018-08-13 格式:PPT 页数:19 大小:178.50KB
返回 下载 相关 举报
《面向对象的程序设计语言——c++》课件--第7章_第1页
第1页 / 共19页
《面向对象的程序设计语言——c++》课件--第7章_第2页
第2页 / 共19页
《面向对象的程序设计语言——c++》课件--第7章_第3页
第3页 / 共19页
《面向对象的程序设计语言——c++》课件--第7章_第4页
第4页 / 共19页
《面向对象的程序设计语言——c++》课件--第7章_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《《面向对象的程序设计语言——c++》课件--第7章》由会员分享,可在线阅读,更多相关《《面向对象的程序设计语言——c++》课件--第7章(19页珍藏版)》请在金锄头文库上搜索。

1、返回第七章 文档和视图本章导读 理解文档类和视图类二者间的关系。 掌握在视图类中利用GetDocument函数获得文档类的指 针,并借助此指针更新文档类中的数据的方法。 掌握在文档类中当文档数据发生了改变时利用 UpDateAllViews()通知所有的视图对象的方法,通过调 用文档类的UpDateAllViews()函数去调用每个视图的成 员函数OnUpdate()函数对相应的视图进行数据更新。 掌握视图类的OnDraw函数的调用机理。 了解SDI文档序列化的工作原理和实现方法。1返回7.1 文档类和视图类间的关系 视图和用户的文档间是紧密相连的,文档类用于管理应 用程序的数据,包括对数据读

2、取、存储和修改。视图类 用于显示文档并管理与用户的交互。这种文档和视图的 结合,称为“文档/视图”结构机制。 定义和操纵数据的代码在文档类中实现;显示数据、解 释用户输入的代码在视图类中实现。 一个SDI(单文档界面)应用程序同一时刻只能打开一 个文档。 在一个MDI(多文档界面)应用程序中,可以有几种不 同类型的文档,每个文档可以有一个或多个视图。同一 时刻可以打开几个文档,打开的文档经常使用适合该文 档的工具栏和菜单。2返回7.2 常用的成员函数在SDI(单文档界面)应用程序中,文档类的基类是 CDocument,它可以有一个或多个视图类,而所有这些视 图类的基类都是CView,任何一个应

3、用程序的文档类和视 图类都是由这两个类派生出来的。 7.2.1 CView类的GetDocument()函数一个视图对象只有一个与之相联系的文档对象,它所包 含的GetDocument()函数可以实现在视图中得到与之相联 系的文档。CView类及其派生类只需调用GetDocument() 函数就可以取得CDocument类的对象指针,从而用此指针 来访问文档类中的的所有可见的数据。3返回GetDocument函数的原型为: CDocument* CView:GetDocument( ) const; 另外,CDocument类中的GetNextView()函数可以在文档类 中获得视图类的指针

4、CDocument类先调用GetFirstViewPosition()函数得到所有 有关该文档类对象的第一个视图,再用该函数的返回结果 调用GetNextView()函数,即可得到CView类的指针,从而 借此访问CView类的数据。7.2 常用的成员函数4返回这两个函数的原型为: virtual POSITION CDocument:GetFirstViewPosition( ) const; virtual CView* CDocument:GetNextView( POSITION如: void CMyDoc:OnRepaintAllViews() POSITION pos = GetF

5、irstViewPosition();while (pos != NULL) CView* pView = GetNextView(pos);pView-UpdateWindow(); 7.2 常用的成员函数5返回7.2.2 CDocument 类的UpDateAllViews()函数 通过文档类的UpDateAllViews()函数调用每个视图的成员 函数OnUpdate()函数对相应的视图进行数据更新。 UpDateAllViews()函数的原型为: void UpDateAllViews(CView*pSender,LPARAM lHint=0L,CObject*pHint=NULL);

6、7.2 常用的成员函数6返回7.2.3 CView类的 OnUpdate()函数 当应用程序调用了CDocument 类的UpDateAllViews()函数 时,应用程序框架就会相应地调用该函数。通常在派生视 图类中的OnUpdate()函数要对文档进行访问,读取文档的 数据,然后再对视图的数据成员或控制进行更新。 OnUpdate()函数原型如下: virtual void OnUpdate(CView*pSender,LPARAM lHint,CObject* pHint); 函数中参数的说明同函数UpdateAllViews()。 利用OnUpdate()函数,可以使视图的某一部分无效

7、,以便 触发视图类的OnDraw()函数。在默认情况即 lHint=0,pHint=NULL时,函数OnUpdate()使视图的整个客户 区无效;如果想要视图的某一部分无效,则需要定义相关 的提示(hint)参数给出准确的无效区域。 用OnUpdate()函数来更新视图的滚动范围。7.2 常用的成员函数7返回7.2.4 Cview 类的OnlnitialUpdate()函数 当应用程序启动或当用户从【File】菜单中选择【New】 或【Open】命令时,CView 类中的虚函数 OnInitialUpdate()都会被自动调用。该函数的作用就 是调用无提示参数(lHint=0,pHint=NU

8、LL)的 OnUpdate()函数。7.2 常用的成员函数8返回7.2.5 MFC应用程序中各个类对象间的相互调用关系 (1). 在框架窗口类中获得当前的文档类和视图类对象的指 针 在一个MDI应用程序中,在框架窗口类(主框架窗口类 或子框架窗口类)中,可以利用基类CFrameWnd的 GetActiveDocument函数,得到指向当前活动的文档类对 象的指针,也可用基类CFrameWnd的GetActiveView函数 ,得到视图类对象的指针。这两个函数的原型如下: virtual CDocument* GetActiveDocument( ); CView* GetActiveView(

9、 ) const;7.2 常用的成员函数9返回(2). 获得应用程序类对象的指针 在MFC应用运行过程中,自始至终存在一个应用程序类对 象,通过全局的Windows API函数AfxGetApp得到应用程 序类对象的指针,该函数的原型为: CWinApp* AfxGetApp( ); (3). 从应用程序类对象中获得主框架类对象的指针 在MDI应用程序中,通过MFC的应用程序类对象,可以获 得指向当前系统的主框架窗口类对象的指针,在应用程序 类CWinApp中有一个数据成员m_pMainWnd,这个数据成 员保存了指向应用程序主框架类对象的指针,通过此数据 成员可以获得指向主框架类对象的指针。

10、7.2 常用的成员函数10返回如: / 获得主框架窗口类对象的指针 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()-m_pMainWnd; / 获得当前活动的MDI子框架窗口的指针 CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame-GetActiveFrame(); / 获得当前活动的子框架窗口的活动视图 CMyView *pView = (CMyView *) pChild-GetActiveView();可以,在程序运行过程中,还可以获得应用程序类对象的指针,从应用程 序类对象中也可获得主框架窗

11、口类对象的指针。7.2 常用的成员函数11返回7.3 在视图类中显示文档类中的数据当用户改变了窗口尺寸,或者窗口恢复了以前被遮盖的 部分,或者当应用程序改变了窗口的数据时,窗口都需 要重新绘制。用户改变窗口的尺寸中,或者窗口恢复以 前被遮盖的部分,这两种事件应用程序框架可以自动觉 察,并且调用OnDraw()函数,但如果应用程序的某个函 数修改了数据,则必须在程序代码中通过调用视图类所 继承的Invalidate()(或者InvalidateRect())成员函数来通 知Windows,调用Invalidate()函数后会触发对函数 OnDraw()的调用。12返回7.4 在视图类中响应键盘消

12、息视图是MFC应用程序中管理视图窗口、处理用户输入以 及在视图窗口内或其他设备上显示输入的部分。在上 一节中,我们通过视图类实现了把一个简单的消息串 显示在视图窗口的中央的功能,在本节中,我们将对 上一节的例子进行扩充,实现应用程序响应键盘的输 入的功能,即运行该程序时,每从键盘上输入一个字 符,便会在视图窗口中显示出所输入的字符。 13返回7.5 SDI文档的序列化 应用程序中,用户处理的数据往往需要存盘做永久的备 份。将文档类中的数据成员变量的值保存在磁盘文件 中或将存储的文档文件中的数据读取到相应的成员变 量中,这个过程称为序列化(Serialize)。14返回应用程序类的InitIns

13、tance函数在调用了AddDocTemplate函数之后 ,会通过CWinApp:ProcessShelllCommand间接调用CWinApp的另 一个非常有用的成员函数OnFleNew,并依次完成下列工作: 1. 构造文档对象,但并不从磁盘中读数据; 2. 构造主框架类CMainFrame的对象,并创建该主框架窗口,但不显 示; 3. 构造视图对象,并创建视图窗口,也不显示; 4. 通过内部机制使文档、主框架和视图“对象”之间“真正”建立 联系,注意与AddDocTemplate函数的区别,AddDocTemplate函数 建立的是“类”之间的联系; 5.调用文档对象的CDocument

14、:OnNewDocument虚成员函数,并调用 CDocument:DeleteContents(消除文档对象的内容)虚函数; 6. 调用视图对象的CView:OnInitialUpdate虚成员函数; 7. 调用框架对象的CFrameWnd:ActiveFrame虚成员函数,以便显示 出具有菜单、工具栏、状态栏以及视图窗口的主框架窗口。7.5 SDI文档的序列化 15返回7.5.2 打开文档 当MFC AppWizard创建应用程序时,它会自动将【文件( File)】菜单中的【打开(Open)】命令(ID号为 ID_FILE_OPEN)映射到CWinApp的OnFileOpen成员函数 。

15、OnFileOpen函数还会进一步完成下列工作: 1. 弹出【打开】对话框,供用户选择一个文件。 2. 调用文档对象的CDocument:OnOpenDocument虚成员 函数。该函数将打开文件,并调用DeleteContents函 数来清除文档对象的内容,然后建立一个CArchive对 象用于数据的读取,接着又自动调用Serialize函数。 3. 调用视图对象的CView:OnInitialUpdate虚成员函数 。7.5 SDI文档的序列化 16返回7.5.3 保存文档 当MFC AppWizard创建应用程序时,它会自动将【文件( File)】菜单中的【保存(Save)】命令与文档类

16、 CDocument的OnFileSave函数在内部关联起来。 OnFileSave函数还会进一步完成下列工作:1. 弹出【保存】对话框,让用户提供一个文件名。 2. 调用文档对象的CDocument:OnSaveDocument虚成员 函数,接着又自动调用Serialize函数,并将CArchive 对象的内容保存在文档中。7.5 SDI文档的序列化 17返回7.5.4 关闭文档 当用户试图关闭文档(或退出应用程序)时,应用程序 会根据用户对文档的修改与否来进一步完成下列任务 : 1. 若文档内容已被修改,则弹出一个消息对话框,询问 用是户否需要将文档保存。如用户选择【是】,则应 用程序执行OnFileSave过程。 2. 调用CDocument:OnCloseDocument虚成员函数,关闭 所有与该文档相关联的文档窗口及相应的视图,调用 文档类的CDocument的DeleteContents来清除文档数据 。7.5 SDI文档的序列化 18

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号