




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章文档视图结构 定制程序框架 张扬应用程序个性 教学内容 7 1文档视图结构 7 2文档视图结构的主要组成类 7 3多视图及窗口切分 7 4文件操作 7 5综合实例 宾馆管理系统的完善 7 6小结思考与练习 7 1文档视图结构 7 1 1文档视图的概念 7 1文档视图结构 7 1 2文档模板在文档视图结构中 文档 框架窗口与视图通过文档模板联系在一起 文档模板负责在运行时创建 动态创建 文档 视图和框架窗口 一个应用程序对象可以管理一个或多个文档模板 每个文档模板用于动态创建和管理一个或多个同类型的文档 这取决于应用程序是SDI程序还是MDI程序 MFC的文档模板类CDocTemplate用于支持文档模板操作 由于文档模板类是一个抽象基类 因此不能直接用其声明对象 只能使用其派生类 对于单文档界面程序 应使用CSingleDocTemplate 单文档模板类 对于一个多文档界面程序 使用CMultipleDocTemplate 多文档模板类 7 1文档视图结构 7 1 3文档类1 文档类的成员函数 获得视图列表中与本文档关联的第一个视图的位置函数 virtualPOSITIONGetFirstViewPosition const 获得下一个本文档关联的视图的位置到rPosition中 virtualCView GetNextView POSITION 7 1文档视图结构 7 1 3文档类1 文档类的成员函数 设置存取文档的默认路径 与文档 窗口 的标题 virtualvoidSetPathName LPCTSTRlpszPathName BOOLbAddToMRU TRUE 判断文档在最后一次存储后是否被修改过 若被修改过 则在用户关闭文档窗口或应用程序时 会提示保存文件BOOLIsModified 设置文档在最后一次存储后是否被修改过voidSetModifiedFlag BOOLbModified TRUE 更新所有视图voidUpdateAllViews CView pSender LPARAMlHint CObject pHint 7 1文档视图结构 7 1 3文档类2 文档的序列化用户处理的数据往往需要存盘作永久备份 将文档类中的数据成员变量的值保存在磁盘文件中 或者将存储的文档文件中的数据读取到相应的成员变量中 这个过程称为序列化 Serialize 序列化实质上就是让对象将其当前的状态 由其成员变量的值表示 写入到永久性存储体 通常是指磁盘 中 以后还可以从永久性存储体中读取对象的状态 载入 从而重建对象 这种对象的保存和恢复的过程称为 序列化 序列化是一种实现对象持久性 Persistent 的机制 它是一个将对象中的数据转换成一个单一元素 通常是Stream 的过程 7 1文档视图结构 7 1 3文档类2 文档的序列化 7 1文档视图结构 7 1 4框架窗口类 7 1文档视图结构 7 1 5视图类1 CView类CView是用户视图类的缺省基类 也是其他各种MFC视图类的基类 视图类CView是窗口类CWnd类的派生类 视图类对象完全覆盖框架窗口的用户区 没有自己的边框 视图规定了用户查看文档数据以及同数据交互的方式 视图类有几个重要的成员函数 GetDocument 成员函数用于从文档类中获取数据值 实际上 该函数提供一个指向文档派生类对象的指针 通过该指针可访问文档派生类的公有成员 例如 GetDocument AddBubble rectBubble 正因为如此 文档类的数据成员只能声明为公有的 而不能象面向对象技术所要求的那样 将所有的数据成员均声明为私有成员 由于文档类和视图类的关系十分密切 这样做可以简化程序设计 并不会因封装性被破坏而造成混乱 在视图类中 用OnDraw 成员函数更新视图 其用法类似窗口类的OnPaint 函数 所不同的是 OnDraw 函数有一个指向CDC类的指针参数 通过该参数可以直接向视图输出 7 1文档视图结构 7 1 5视图类2 CEditView类CEditView类对象是一种视图 像CEdit类一样 它也提供窗口编辑控制功能 可以用来执行简单文本操作 如打印 查找 替换 剪贴板的剪切 复制和粘贴等 由于CEditView类自动封装上述功能的映射函数 因此只要在文档模板中使用CEditView类 那么应用程序的 编辑 菜单和 文件 菜单里的菜单项都可自动激活 3 CRichEditView类CRichEditView类使用了复合文本编辑控件 因此它支持混合字体格式和更大数据量的文本 CRichEditView类被设计成与CRichEditDoc和CRichEditCntrItem类一起使用 它们可实现一个完整的ActiveX包容器应用程序 4 CFormView类CFormView类是一个非常有用的视图类 它具有许多无模式对话框的特点 像CDialog的派生类一样 CFormView的派生类也和相应的对话框资源相联系 它也支持对话框数据交换和对话框数据确认 DDX和DDV 7 1文档视图结构 7 1 5视图类5 CHtmlView类CHtmlView类是在文档视图结构中提供WebBrowser控件的功能 WebBrowser控件可以浏览网址 也可以作为本地文件和网络文件系统的窗口 它支持超级链接 统一资源定位 URL 导航器并维护历史列表等 6 CScrollView类CScrollView类不仅能直接支持视图的滚动操作 而且还能管理视口的大小和映射模式 并能响应滚动条消息 键盘消息以及鼠标滚轮消息 7 2文档视图结构的主要组成类 7 2 1单文档应用程序的组成类1 示例程序的创建2 单文档应用程序的组成类向导生成的一个典型的单文档应用程序包括一个应用程序类CMyEditorApp 一个主框架窗口类CMainFrame 一个文档类CMyEditorDoc 一个视图类CMyEditorView 一个 关于 对话框类CAboutDlg 7 2文档视图结构的主要组成类 7 2 2多文档应用程序的组成类1 示例程序的创建2 多文档应用程序的组成类向导生成的一个典型的多文档应用程序包括一个应用程序类CMyWordApp 一个主框架窗口类CMainFrame 一个子框架窗口类CChildFrame 一个文档类CMyWordDoc 一个视图类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 文档视图结构中各对象之间的通信 1 获取应用程序类对象的指针获取应用程序类对象的指针可以使用全局函数AfxGetApp 这个函数的原型如下 CWinApp AfxGetApp 这个全局函数可以在任何需要的时候使用 函数的返回值是指向应用程序基类CWinApp的指针 2 获取主框架窗口类对象的指针获取主框架窗口类对象的指针可以使用全局函数AfxGetMainWnd 获取主窗口对象的指针 函数的原型如下 CWnd AfxGetMainWnd 3 从文档类中获取视图对象指针在文档类中有一个与其关联的各视图对象的列表 并可通过CDocument类的成员函数GetFirstViewPosition和GetNextView来定位相应的视图对象 GetFirstViewPosition函数用来获得与文档类相关联的视图列表中第一个可见视图的位置 GetNextView函数用来获取指定视图位置的视图类指针 并将此视图位置移动到下一个位置 若没有下一个视图 则视图位置为NULL 它们的原型如下 virtualPOSITIONGetFirstViewPosition const virtualCView GetNextView POSITION 7 3多视图及窗口切分 7 3 1多视图MFC支持在同一文档上使用多个视图的3种通用模式 这些模式是 1 在各自MDI文档窗口中包含同一个视图类的多个视图对象 用户有时需要应用程序能为同一个文档打开另一个文档窗口 以便能同时使用两个文档窗口来查看文档的不同部分内容 用MFCAppWizard创建的多文档应用程序支持这种模式 当用户选择 窗口 菜单的 新建窗口 命令时 系统就会为第一个文档窗口创建一个副本 2 在同一个文档窗口中包含同一个视图类的多个视图对象 这种模式实际上是使用 切分窗口 机制使SDI应用程序具有多视的特征 3 在单独一个文档窗口中包含不同视图类的多个视图对象 在该模式下 多个视图共享同一个文档窗口 它有点象 切分窗口 但由于视图可由不同的视图类构造 所以同一个文档可以有不同的显示方法 例如 同一个文档可同时有文字显示方式及图形显示方式的视图 7 3多视图及窗口切分 7 3 2窗口的切分对于 静态切分 窗口来说 当窗口第一次被创建时 窗格就已经被切分好了 窗格的次序和数目不能再被改变 但用户可以移动切分条来调整窗格的大小 每个窗格通常是不同的视图类 对于 动态切分 窗口来说 它允许用户在任何时候对窗口进行切分 用户既可以通过选择菜单项来对窗口进行切分 也可以通过拖动滚动条中的切分块对窗口进行切分 动态切分窗口中的窗格通常使用的是同一个视图类 当切分窗口被创建时 左上窗格通常被初始化成一个特殊的视图 当视图沿着某个方向被切分时 另一个新添加的视图对象被动态创建 当视图沿着两个方向被切分时 新添加的三个视图对象则被动态创建 当用户取消切分时 所有新添加的视图对象被删除 但最先的视图仍被保留 直到切分窗口本身消失为止 7 3多视图及窗口切分 7 3 3多视图编程示例 7 4文件操作 7 4 1文件操作类CFile1 文件的打开与关闭在MFC中 使用CFile打开一个文件通常使用下列两个步骤 1 构造一个不带任何参数的CFile对象 2 调用成员函数Open并指定文件路径以及文件标志 CFile类的Open函数原型如下 BOOLOpen LPCTSTRlpszFileName UINTnOpenFlags CFileException pError NULL 参数lpszFileName为欲打开的文件名 文件名可以包含路径和文件名两部分 如 d bak test txt 如果此字符串不包含文件路径 如 test bak 则系统默认为当前路径 即生成的可执行文件所在目录 参数nOpenFlags用于设置访问模式 指定当打开文件时进行的动作 可以将以下所列模式用按位或 操作符连接起来 7 4文件操作 7 4 1文件操作类CFile2 文件的读写CFile类支持文件的读 写和定位操作 它们相关函数的原型如下 UINTRead void lpBuf UINTnCount 此函数将文件中指定大小的数据读入指定的缓冲区 并返回向缓冲区传输的字节数 需要说明的是 这个返回值可能小于nCount 这是因为可能到达了文件的结尾 voidWrite constvoid lpBuf UINTnCount 此函数将缓冲区的数据写到文件中 参数lpBuf用来指定要写到文件中的数据缓冲区的指针 nCount表示从数据缓冲区传送的字节数 对于文本文件 每行的换行符也被计算在内 7 4文件操作 7 4 1文件操作类CFile3 文件的定位CFile可以使程序随机读写文件 这一随机性就是通过文件定位操作来完成的 定位操作用于确定CFile的读写指针 使得程序可以读写任意位置的数据 CFile为定位操作提供了下列成员函数 1 CFile Seek 函数CFile Seek 函数用于重新定位之前打开的文件读写指针 以实现随机访问 其函数原型为 virtualLONGSeek LONGlOff UINTnFrom throw CFileException 7 4文件操作 7 4 1文件操作类CFile3 文件的定位CFile为定位操作提供了下列成员函数 1 CFile Seek 函数CFile Seek 函数用于重新定位之前打开的文件读写指针 以实现随机访问 其函数原型为 virtualLONGSeek LONGlOff UINTnFrom 2 CFile SeekToBegin 函数CFile SeekBegin 函数用于将文件指针移至文件开头 函数原型如下 voidSeekToBegin throw CFileException 3 CFile SeekToEnd 函数CFile SeekToEnd 函数将文件指针指向文件逻辑尾部 函数原型如下 DWORDSeekToEnd throw CFileException 7 4文件操作 7 4 1文件操作类CFile4 文件管理操作对文件的操作 除了打开文件并进行读写外以外 还可以进行删除 重命名等操作 CFile类也为这些操作提供了支持 1 CFile GetLength 函数CFile GetLength 函数获取文件的长度 函数原型如下 virtualDWORDGetLength const throws CFileException 该函数没有参数 直接返回文件以字节计的长度 2 CFile GetFileName 函数CFile GetFileName 函数用于获取文件名 例如 当打开了文件c aa bb dat 调用GetFileName 就可以获得该文件的名字bb dat 其原型为virtualCStringGetFileName const 函数返回值即为指定文件的名称 3 CFile GetFileTitle 函数CFile GetFileTitle 函数用于获取制定文件的标题 例如 当打开了文件c aa bb dat 调用GetFileTitle 就可以获得该文件的标题bb 其原型为 virtualCStringGetFileTitle const 函数返回值即为指定文件的标题 7 4文件操作 7 4 1文件操作类CFile4 文件管理操作 4 File GetFilePath 函数File GetFilePath 函数用于获取制定文件的全路径 其函数原型为 virtualCStringGetFilePath 函数的返回值即为指定文件的完整路径 5 CFile GetStatus 函数CFile GetStatus 函数用于获取文件的状态 有两个不同的原型 非静态成员变量的原型和静态成员变量原型 BOOLGetStatus CFileStatus 7 4文件操作 7 4 2文本文件类CStdioFileCStdioFile对文本文件进行操作 CStdioFile定义了新的成员变量m pStream 类型是FILE 在打开或者创建文件时 使用 open osfhandle从m hFile Win32文件句柄 得到一个 C 的FILE类型的文件指针 然后 在文件操作中 使用 C 的文件操作函数 例如 读文件使用 fread 而不是 ReadFile 写文件使用了 fwrite 而不是 WriteFile 等等 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 其次 它提供了许多函数用来获取文件的状态或者属性 1 FindFile函数FindFile函数的定义为 BOOLFindFile LPCTSTRpstrName NULL DWORDdwUnused 0 返回值 如果成功 则返回真值 否则为假 参数pstrName 指向待找文件名字符串 可包含星号 如果不填 则查找当前目录下的所有文件 参数dwUnused 为保留参数 必须为0或不填 2 FindNextFile函数FindNextFile函数的定义为 BOOLFindNextFile 返回值 如果还有文件 则返回真值 如果为最后一个文件 则为假 7 6
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全教育心肺复苏课件
- 牧场年终总结课件
- 林业局面试题库及答案
- 科技服务业信用评价指标评分细则
- 安全教育培训通信稿课件
- 客运服务员面试题库及答案
- 考研内科面试题库及答案
- 2025年新能源行业绿色金融支持绿色产业布局研究报告
- 2025年新能源汽车电池热失控防护技术市场分析报告
- 安全教育培训记录小学课件
- GB/T 41130-2021展览场馆安全管理基本要求
- 湘美版美术一年级上册全册课件
- 环境经济学(张)课件
- 人才管理-人才选用育留课件
- 成功八步课件
- 玉石床垫讲稿课件
- 初中音乐七年级上册第一单元 红岩魂走进歌乐山
- 栈桥修复方案(全文)
- 某五星级酒店单项工程经济指标
- 【课件】《红烛》课件24张统编版高中语文必修上册
- 电气一次设备吊装搬运施工方案
评论
0/150
提交评论