《文档视图结构》PPT课件.ppt

上传人:小飞机 文档编号:5520625 上传时间:2023-07-18 格式:PPT 页数:31 大小:282KB
返回 下载 相关 举报
《文档视图结构》PPT课件.ppt_第1页
第1页 / 共31页
《文档视图结构》PPT课件.ppt_第2页
第2页 / 共31页
《文档视图结构》PPT课件.ppt_第3页
第3页 / 共31页
《文档视图结构》PPT课件.ppt_第4页
第4页 / 共31页
《文档视图结构》PPT课件.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《《文档视图结构》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《文档视图结构》PPT课件.ppt(31页珍藏版)》请在三一办公上搜索。

1、第7章 文档视图结构 定制程序框架,张扬应用程序个性,教学内容7.1 文档视图结构7.2 文档视图结构的主要组成类7.3 多视图及窗口切分7.4 文件操作7.5 综合实例宾馆管理系统的完善7.6 小结 思考与练习,7.1 文档视图结构,7.1.1 文档视图的概念,7.1 文档视图结构,文档模板在文档视图结构中,文档、框架窗口与视图通过文档模板联系在一起。文档模板负责在运行时创建(动态创建)文档、视图和框架窗口。一个应用程序对象可以管理一个或多个文档模板,每个文档模板用于动态创建和管理一个或多个同类型的文档(这取决于应用程序是SDI程序还是MDI程序)。MFC的文档模板类CDocTemplate

2、用于支持文档模板操作。由于文档模板类是一个抽象基类,因此不能直接用其声明对象,只能使用其派生类。对于单文档界面程序,应使用CSingleDocTemplate(单文档模板类),对于一个多文档界面程序,使用CMultipleDocTemplate(多文档模板类)。,7.1 文档视图结构,7.1.3 文档类1、文档类的成员函数 获得视图列表中与本文档关联的第一个视图的位置函数:virtual POSITION GetFirstViewPosition()const;获得下一个本文档关联的视图的位置到rPosition中:virtual CView*GetNextView(POSITION,7.1

3、文档视图结构,7.1.3 文档类1、文档类的成员函数 设置存取文档的默认路径(与文档(窗口)的标题)virtual void SetPathName(LPCTSTR lpszPathName,BOOL bAddToMRU=TRUE);判断文档在最后一次存储后是否被修改过,若被修改过,则在用户关闭文档窗口或应用程序时,会提示保存文件BOOL IsModified();设置文档在最后一次存储后是否被修改过void SetModifiedFlag(BOOL bModified=TRUE);更新所有视图void UpdateAllViews(CView*pSender,LPARAM lHint,COb

4、ject*pHint);,7.1 文档视图结构,7.1.3 文档类2、文档的序列化用户处理的数据往往需要存盘作永久备份。将文档类中的数据成员变量的值保存在磁盘文件中,或者将存储的文档文件中的数据读取到相应的成员变量中。这个过程称为序列化(Serialize)。序列化实质上就是让对象将其当前的状态(由其成员变量的值表示)写入到永久性存储体(通常是指磁盘)中,以后还可以从永久性存储体中读取对象的状态(载入),从而重建对象。这种对象的保存和恢复的过程称为“序列化”。序列化是一种实现对象持久性(Persistent)的机制,它是一个将对象中的数据转换成一个单一元素(通常是Stream)的过程。,7.1

5、 文档视图结构,7.1.3 文档类2、文档的序列化,7.1 文档视图结构,7.1.4 框架窗口类,7.1 文档视图结构,7.1.5 视图类1、CView类CView是用户视图类的缺省基类,也是其他各种MFC视图类的基类。视图类CView是窗口类CWnd类的派生类。视图类对象完全覆盖框架窗口的用户区,没有自己的边框。视图规定了用户查看文档数据以及同数据交互的方式。视图类有几个重要的成员函数。GetDocument()成员函数用于从文档类中获取数据值。实际上,该函数提供一个指向文档派生类对象的指针,通过该指针可访问文档派生类的公有成员。例如:GetDocument()AddBubble(rectB

6、ubble);正因为如此,文档类的数据成员只能声明为公有的,而不能象面向对象技术所要求的那样,将所有的数据成员均声明为私有成员。由于文档类和视图类的关系十分密切,这样做可以简化程序设计,并不会因封装性被破坏而造成混乱。在视图类中,用OnDraw()成员函数更新视图,其用法类似窗口类的OnPaint()函数。所不同的是,OnDraw()函数有一个指向CDC类的指针参数,通过该参数可以直接向视图输出。,7.1 文档视图结构,7.1.5 视图类2、CEditView类CEditView类对象是一种视图,像CEdit类一样,它也提供窗口编辑控制功能,可以用来执行简单文本操作,如打印、查找、替换、剪贴板

7、的剪切、复制和粘贴等。由于CEditView类自动封装上述功能的映射函数,因此只要在文档模板中使用CEditView类,那么应用程序的“编辑”菜单和“文件”菜单里的菜单项都可自动激活。3、CRichEditView类CRichEditView类使用了复合文本编辑控件,因此它支持混合字体格式和更大数据量的文本。CRichEditView类被设计成与CRichEditDoc和CRichEditCntrItem类一起使用,它们可实现一个完整的ActiveX包容器应用程序。4、CFormView类CFormView类是一个非常有用的视图类,它具有许多无模式对话框的特点。像CDialog的派生类一样,C

8、FormView的派生类也和相应的对话框资源相联系,它也支持对话框数据交换和对话框数据确认(DDX和DDV)。,7.1 文档视图结构,7.1.5 视图类5、CHtmlView 类CHtmlView 类是在文档视图结构中提供WebBrowser控件的功能。WebBrowser控件可以浏览网址,也可以作为本地文件和网络文件系统的窗口,它支持超级链接、统一资源定位(URL)导航器并维护历史列表等。6、CScrollView类CScrollView类不仅能直接支持视图的滚动操作,而且还能管理视口的大小和映射模式,并能响应滚动条消息、键盘消息以及鼠标滚轮消息。,7.2 文档视图结构的主要组成类,7.2.

9、1 单文档应用程序的组成类1、示例程序的创建2、单文档应用程序的组成类向导生成的一个典型的单文档应用程序包括一个应用程序类CMyEditorApp、一个主框架窗口类CMainFrame、一个文档类CMyEditorDoc、一个视图类CMyEditorView、一个“关于”对话框类CAboutDlg。,7.2 文档视图结构的主要组成类,7.2.2 多文档应用程序的组成类1、示例程序的创建2、多文档应用程序的组成类向导生成的一个典型的多文档应用程序包括一个应用程序类CMyWordApp、一个主框架窗口类CMainFrame、一个子框架窗口类CChildFrame、一个文档类CMyWordDoc、一

10、个视图类CMyWordView、一个“关于”对话框类CAboutDlg。由于该程序可以是复合文档的容器,即该程序可以嵌入别的应用程序对象,故该类中还有一个丰富文本条目类CMyWordCntrItem。,7.2 文档视图结构的主要组成类,7.2.2 多文档应用程序的组成类,7.2 文档视图结构的主要组成类,7.3.3 文档视图结构中各对象之间的关系1、文档视图结构中各个对象之间的关系,7.2 文档视图结构的主要组成类,7.3.3 文档视图结构中各对象之间的关系1、文档视图结构中各个对象之间的关系,7.2 文档视图结构的主要组成类,7.3.3 文档视图结构中各对象之间的关系2、文档视图结构中各对象

11、之间的通信(1)获取应用程序类对象的指针获取应用程序类对象的指针可以使用全局函数AfxGetApp(),这个函数的原型如下:CWinApp*AfxGetApp();这个全局函数可以在任何需要的时候使用,函数的返回值是指向应用程序基类CWinApp的指针。(2)获取主框架窗口类对象的指针获取主框架窗口类对象的指针可以使用全局函数AfxGetMainWnd()获取主窗口对象的指针,函数的原型如下:CWnd*AfxGetMainWnd();(3)从文档类中获取视图对象指针在文档类中有一个与其关联的各视图对象的列表,并可通过CDocument类的成员函数GetFirstViewPosition和Get

12、NextView来定位相应的视图对象。GetFirstViewPosition函数用来获得与文档类相关联的视图列表中第一个可见视图的位置,GetNextView函数用来获取指定视图位置的视图类指针,并将此视图位置移动到下一个位置,若没有下一个视图,则视图位置为NULL。它们的原型如下:virtual POSITION GetFirstViewPosition()const;virtual CView*GetNextView(POSITION,7.3 多视图及窗口切分,7.3.1 多视图MFC支持在同一文档上使用多个视图的3种通用模式,这些模式是:(1)在各自MDI文档窗口中包含同一个视图类的多

13、个视图对象。用户有时需要应用程序能为同一个文档打开另一个文档窗口,以便能同时使用两个文档窗口来查看文档的不同部分内容。用MFC AppWizard创建的多文档应用程序支持这种模式,当用户选择“窗口”菜单的“新建窗口”命令时,系统就会为第一个文档窗口创建一个副本。(2)在同一个文档窗口中包含同一个视图类的多个视图对象。这种模式实际上是使用“切分窗口”机制使SDI应用程序具有多视的特征。(3)在单独一个文档窗口中包含不同视图类的多个视图对象。在该模式下,多个视图共享同一个文档窗口。它有点象“切分窗口”,但由于视图可由不同的视图类构造,所以同一个文档可以有不同的显示方法。例如,同一个文档可同时有文字

14、显示方式及图形显示方式的视图。,7.3 多视图及窗口切分,7.3.2 窗口的切分对于“静态切分”窗口来说,当窗口第一次被创建时,窗格就已经被切分好了,窗格的次序和数目不能再被改变,但用户可以移动切分条来调整窗格的大小。每个窗格通常是不同的视图类。对于“动态切分”窗口来说,它允许用户在任何时候对窗口进行切分,用户既可以通过选择菜单项来对窗口进行切分,也可以通过拖动滚动条中的切分块对窗口进行切分。动态切分窗口中的窗格通常使用的是同一个视图类。当切分窗口被创建时,左上窗格通常被初始化成一个特殊的视图。当视图沿着某个方向被切分时,另一个新添加的视图对象被动态创建;当视图沿着两个方向被切分时,新添加的三

15、个视图对象则被动态创建。当用户取消切分时,所有新添加的视图对象被删除,但最先的视图仍被保留,直到切分窗口本身消失为止。,7.3 多视图及窗口切分,7.3.3 多视图编程示例,7.4 文件操作,7.4.1 文件操作类CFile1、文件的打开与关闭在MFC中,使用CFile打开一个文件通常使用下列两个步骤:(1)构造一个不带任何参数的CFile对象;(2)调用成员函数Open并指定文件路径以及文件标志。CFile类的Open函数原型如下:BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException*pError=NULL);参数lpsz

16、FileName为欲打开的文件名,文件名可以包含路径和文件名两部分。如“d:baktest.txt”,如果此字符串不包含文件路径,如“test.bak”,则系统默认为当前路径,即生成的可执行文件所在目录。参数nOpenFlags用于设置访问模式,指定当打开文件时进行的动作,可以将以下所列模式用按位或“|”操作符连接起来。,7.4 文件操作,7.4.1 文件操作类CFile2、文件的读写CFile类支持文件的读、写和定位操作。它们相关函数的原型如下:UINT Read(void*lpBuf,UINT nCount);此函数将文件中指定大小的数据读入指定的缓冲区,并返回向缓冲区传输的字节数。需要说

17、明的是,这个返回值可能小于nCount,这是因为可能到达了文件的结尾。void Write(const void*lpBuf,UINT nCount);此函数将缓冲区的数据写到文件中。参数lpBuf用来指定要写到文件中的数据缓冲区的指针,nCount表示从数据缓冲区传送的字节数。对于文本文件,每行的换行符也被计算在内。,7.4 文件操作,7.4.1 文件操作类CFile3、文件的定位CFile可以使程序随机读写文件,这一随机性就是通过文件定位操作来完成的。定位操作用于确定CFile的读写指针,使得程序可以读写任意位置的数据。CFile为定位操作提供了下列成员函数。(1)CFile:Seek()

18、函数CFile:Seek()函数用于重新定位之前打开的文件读写指针,以实现随机访问,其函数原型为:virtual LONG Seek(LONG lOff,UINT nFrom);throw(CFileException);,7.4 文件操作,7.4.1 文件操作类CFile3、文件的定位CFile为定位操作提供了下列成员函数。(1)CFile:Seek()函数CFile:Seek()函数用于重新定位之前打开的文件读写指针,以实现随机访问,其函数原型为:virtual LONG Seek(LONG lOff,UINT nFrom);(2)CFile:SeekToBegin()函数CFile:Se

19、ekBegin()函数用于将文件指针移至文件开头,函数原型如下:void SeekToBegin();throw(CFileException);(3)CFile:SeekToEnd()函数CFile:SeekToEnd()函数将文件指针指向文件逻辑尾部。函数原型如下:DWORD SeekToEnd();throw(CFileException);,7.4 文件操作,7.4.1 文件操作类CFile4、文件管理操作对文件的操作,除了打开文件并进行读写外以外,还可以进行删除、重命名等操作。CFile类也为这些操作提供了支持。(1)CFile:GetLength()函数CFile:GetLengt

20、h()函数获取文件的长度,函数原型如下:virtual DWORD GetLength()const;throws(CFileException);该函数没有参数,直接返回文件以字节计的长度。(2)CFile:GetFileName()函数CFile:GetFileName()函数用于获取文件名。例如,当打开了文件c:aabb.dat,调用GetFileName()就可以获得该文件的名字bb.dat。其原型为virtual CString GetFileName()const;函数返回值即为指定文件的名称。(3)CFile:GetFileTitle()函数CFile:GetFileTitle(

21、)函数用于获取制定文件的标题,例如,当打开了文件c:aabb.dat,调用GetFileTitle()就可以获得该文件的标题bb。其原型为:virtual CString GetFileTitle()const;函数返回值即为指定文件的标题。,7.4 文件操作,7.4.1 文件操作类CFile4、文件管理操作(4)File:GetFilePath()函数File:GetFilePath()函数用于获取制定文件的全路径。其函数原型为:virtual CString GetFilePath();函数的返回值即为指定文件的完整路径。(5)CFile:GetStatus()函数CFile:GetSta

22、tus()函数用于获取文件的状态,有两个不同的原型:非静态成员变量的原型和静态成员变量原型。BOOL GetStatus(CFileStatus,7.4 文件操作,7.4.2 文本文件类CStdioFile CStdioFile对文本文件进行操作。CStdioFile定义了新的成员变量m_pStream,类型是FILE*。在打开或者创建文件时,使用_open_osfhandle从m_hFile(Win32文件句柄)得到一个“C”的FILE类型的文件指针,然后,在文件操作中,使用“C”的文件操作函数。例如,读文件使用_fread,而不是:ReadFile,写文件使用了_fwrite,而不是:Wr

23、iteFile,等等。m_hFile是CFile的成员变量。另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是实现了两个新的操作ReadString和WriteString。,7.4 文件操作,7.4.3 文件查找类CFileFind 为了方便文件查找,MFC把有关功能归结成为一个类CFileFind。CFileFind派生于CObject类。首先,它使用FindFile和FineNextFile包装了Win32函数:FindFirstFile和:FindNextFile;其次,它提供了许多函数用来获取文件的状态或者属性。1F

24、indFile函数 FindFile函数的定义为:BOOL FindFile(LPCTSTR pstrName=NULL,DWORD dwUnused=0);返回值:如果成功,则返回真值,否则为假。参数pstrName:指向待找文件名字符串,可包含星号,如果不填,则查找当前目录下的所有文件。参数dwUnused:为保留参数,必须为0或不填。2FindNextFile函数FindNextFile函数的定义为:BOOL FindNextFile();返回值:如果还有文件,则返回真值;如果为最后一个文件,则为假。,7.6 小结大多数MFC应用程序是以文档视图结构为基础的。文档和视图之间存在着比较复杂

25、的关系。文档是一个抽象对象,代表着应用程序的数据,并且一般对应文件的内容。视图则提供该数据的一种表示形式并接受用户界面事件。它们之间通过一些成员函数建立了联系。应用程序将从MFC提供的CDocument类派生它们的文档类。CDocument类封装了文档对象的许多基本功能。在文档设计时,添加一些成员变量,文档序列化函数使用这些成员变量读写磁盘文件。可以从MFC提供的CView 基类中派生应用程序视图类,它的对象就是视图窗口。在一个SDI应用程序中,视图窗口的父窗口是主框架窗口;在一个MDI应用程序中,视图窗口的父窗口是包容它的MDI子窗口。在视图类的设计时,所做的工作是如何在视图中显示出文档的数

26、据。在MFC应用程序中,尽管可以在文档视图应用程序中加入串行化进行文件的打开和保存操作,但是这种方法有很多局限,不能实现灵活的文件访问。当程序需要自定义文件操作时,可以使用CFile类。利用MFC的CFile的成员函数,我们可以实现文件的I/O操作,完成一些特殊的任务。,思考与练习1、在应用程序中,文档有什么作用?2、文档数据序列化的意义是什么?3、如何声明一个文档类?怎样实现它的序列化?4、什么是主窗口和文档窗口?5、文档模板的作用是什么?如何创建文档模板?6、对于SDI应用程序来说,能否有多个文档类型?应如何实现?7、视图类的派生类有哪些?其基本使用方法有哪些?8、什么是文档/视图结构?它们的工作机制是什么?9、说明主窗口、文档窗口、视图及文档之间的相互关系。10、描述文档视图结构中的对象之间的相互关系和工作机制。11、什么是“一档多视”?文档中的数据该变后,怎么通知视图?12、编写一个简单的字处理程序,该程序能够实现文件的打开和保存、字体的格式化操作等操作。,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号