当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第9章 单文档与多文档 > 9-2 Doc/View框架的主要成员 > Video
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
文档模板框架的主要成员
Doc/View框架虽然可以调用众多不同的类
但它的核心总共就5个
它们分别是
主要是这五个
那首先我们来介绍一下CWinApp
CWinApp类代表主程序
CWinApp本身是不可见的
它负责维护进程的启动、终止、消息循环、命令行参数和资源管理等等
MFC中的主应用程序类封装用于Windows操作系统
的应用程序的初始化、运行和终止
基于框架生成的应用程序必须有
而且仅有一个是从CWinApp派生的类的对象
那也就是说在创建窗口之前要先构造这个对象
CWinApp类常用的方法主要有这些
那么有几个我想大家应该比较熟悉了
比如说LoadCursor 载入光标资源
LoadIcon 载入图标资源
是将一个文档模板加到应用程序的可用文档模板列表中
再比如说SelectPrinter
是选择先前由用户在打印对话框中指定的打印机
这些的话 是它常用的方法
大家可以通过msdn这个网站上看到
它更多的更详细的内容
那么CWinApp常用的初始化函数有这一些
比如说SetRegistryKey
那么使应用程序的设置保存在注册表中
而不是.INT这个文件中
那么这是设置对话框和消息框缺省背景函数
再比如说EnableShellOpen
这是允许用户通过Windows的文件管理器打开数据文件
比如说RegisterShellFileTypes
这是在Windows的文件管理器中注册所有的应用程序的文档类型
那么这是一些常用的初始化函数
常用的命令操作函数比如说OnFileNew
这个大家应该很熟悉
它实现的是ID_FILE_NEW命令
实际上就是文件菜单项下面的新建菜单项
它是文件菜单下的打开文件操作命令
它实现的是ID_FILE_OPEN的命令
OnHelp处理应用程序内的F1帮助命令
再比如说OnContextHelp这是处理应用程序内的SHIFT+F1的命令
下面我们介绍CDocument类
常用的方法有这一些
GetTitle这是获得文档的标题
那么既然能get就可以set
那么这可以是SetTitle
设置文档标题
再比如说GetPathName跟SetPathName
这是获取或者设置文档数据文件的路径的字符串
再比如说AddView
这是对与文档相关联的视图列表添加到指定的视图
Remove就是Add的逆操作 移走
那么这就是从文档视图列表中删除视图
UpdateAllViews这是通知所有视图
文档已被修改 应该重新绘制
DisconnectViews这是使文档与视图相分离
GetFile是获得指向CFile类型的指针
这是CDocument的一般方法
这些方法用的会比较多
它还有一些虚拟方法
比如说OnNewDocument OnOpenDocument
这些比如说是用来“建立”、“打开”、“保存”和“关闭”文档的
比如说这个CanCloseFrame
这是确定观察文档的框架窗口是否被允许关闭
实际上这是一个判断
这是在未撤销文档对象时删除文档数据
ReleaseFile这是释放文件以允许其他应用程序使用
SaveModified这是查询文档的修改状态并存储修改的文档
那么这个IsModified 这是一个判断
确定文档从它最后一次存储后是否被修改过
那么在文档修改过程中
我们通常要设置它一个标志
所以这里有一个函数叫做SetModifiedFlag
这是设置文档从它最后一次存储后是否被修订过的
这么一个标志是布尔值
所以它的值就是True/False
然后这个GetFirstViewPosition
这是获得视图列表头的位置
GetNextView获取视图列表的下一个视图
那么这些CDocument类的虚拟的方法是经常用到的
那么最常用到的是什么呢?
是SetModifiedFlag()和UpdateAllViews()
文档内容被修改后
一般要调用SetModifiedFlag()来设置一个标志
然后调用UpdateAllViews()刷新所有的和文档关联的视图
那实际上这个函数调用各个视图类的OnUpdate()函数
这样做可以保证各个视图之间的同步
那用户可以通过GetFirstView()和GetNextView()
得到和文件相关联的视图的指针
通常代码是这么写的
GetFirstViewPosition()函数它返回了一个位置的值pos
pos的数据类型是POSITION的数据类型
那么如果这个POSITION不是空
我们就可以获得后续的视图指针
那如果是空的话
那就根本没有获得表头位置
就根本无法谈起继续下面视图的操作
那CDocument类在现在流行的这个MVC
就是Model View Control
设计模式中相当于其中的Model
表示抽象数据类型
文档最主要的操作功能有
打开保存文档
维护文档相关的视图列表
维护文档修改的标志
通过电子邮件发送文档等等
那用户修改文档数据的时候
调用SetModifiedFlag方法来标志数据是否被改过了
当程序关闭该文档关联的最后一个视图的时候
文档会自动提示你保存修改
那从CDocument类派生新的文档类的一般过程是这样的
为每一个文档类型从CDocument类派生一个相应的文档类
然后为文档类添加成员变量
这些变量主要用来保存文档的数据
并使其他的对象
比如说视图对象
可以访问这些成员变量
从而实现文档和视图的相互搭配使用
最后重载,重载用Serialize成员函数
实现文档数据的串行化
那无论是保存文档或是打开文档
应用程序都是通过调用文档类的
Serialize串行化成员函数来完成操作的
因此在大多数的情况下
我们都需要重载Serialize成员函数
这个成员函数带有一个CArchive类型的参数
这是一个与所打开的文件相关联的对象
一般情况下
我们说总是使用CArchive对象来保存和打开文档
那我们谈到CArchive对象
它提供了一个类型安全缓冲机制
用于将可序列化或者说可串行化对象
写入CFile对象
或从中读取可串行化的对象
通常CFile对象表示磁盘文件
但是它也可以是表示剪贴板的内存文件
我们刚才谈到的串行化
在有的书里面写的是序列化
在框架创建CArchive对象时
已根据用户选择的是“保存”或者“另存为”
还是“打开”来设置了CArchive对象的类型
我们可以使用CArchive类的成员函数IsStoring
来检索当前CArchive类对象的类型
从而得知用户所期望的操作是保存还是读取
执行不同的操作
好!我们下面介绍CView类 就是视图类
它也是从CWnd下面派生的
那么大家看这个层次构架就知道
视图类具有CWnd的所有功能
比如说创建、移动、显示和隐藏窗口等等
CView类可以接受任何Windows的消息
而CDocument类则不行
CView类提供了文档类所需要的最基本的功能实现
那么CView这个类主要的虚拟方法有这一些
第一个是IsSelected
确定文档是否被选中
OnScroll 当用户滚动时CView的响应
那比如说OnScroll可以水平滚动垂直滚动
那用户响应这滚动的时候
当用户操作这滚动的时候
CView要对用户这个滚动操作进行响应
在类第一次构造后由MFC调用
OnDraw这个函数在前面上一讲的例子里面已经出现过
它是由MFC调用发出文档到设备描述表
关于设备描述表的概念大家可以再复习一下我们前面讲的
Windows编程里面的一些基本内容
OnUpdate是由MFC调用对文档的修改进行响应
OnPrepareDC是在调用OnDraw前允许修改设备描述表
由MFC调用
CView类中最常用的是OnDraw函数
这个函数在屏幕发生变化或因为焦点的变化
需要重新绘制时调用
如果没有这个函数
就不可能在程序的切换后保证屏幕的正确显示
OnDraw只要是需要重绘的时候都会调用
无论是往屏幕画还是往打印机打
WM_PAINT这个消息呢
只是负责往屏幕上画图
不负责往打印机上输出
所以这是OnDraw函数跟WM_PAINT消息的区别
所以要注意尽量不要在OnDraw之外的函数调用绘图方法
那些方法不会在视图需要重新绘制的时候被自动调用
如果要想在数据更新的时候强制视图更新
可调用Invalidate方法和UpdateWindow方法来实现
CView类有一些子类
比如说CEditView这是简单的文本编辑器
比如说记事本文件
CListView的话呢是基于列表的视图
类似文件夹的浏览
CTreeView基于树状控件的视图
它类似文件浏览左侧的树状结构
CRichEditView支持多种字体、OLE和RTF格式的高级编辑器
CScrollView是支持滚动条的视图
CFormView是窗体视图
支持它在上面使用对话框控件
CRecordView是连接到ODBC数据库的视图
那么关于连接到ODBC数据库
我们在数据库那一讲里面会给大家做详细的介绍
还有CDaoRecordView是连接到DAO数据库的视图
好!下面我们介绍CDocTemplate类
这是文档模板类
在应用程序中有着非常重要的作用
它将原本独立的文档、视图和框架窗口对象联系在一起
文档模板类通常负责具体的关联文档、视图和框架的创建
大家可以看一下文档模板类它的层次结构
文档视图结构中
将文档、视图和框架关联起来的对象是CDocTemplate类
对于单文档程序是由CSingleDocTemplate类来完成
而对于多文档程序则是由CMultiDocTemplate类完成
这两个类都是CDocTemplate类的子类
CDocTemplate这个类的一般方法和虚拟方法主要有这些
比如说GetDocString是获得与文档相关的字符串
这个LoadTemplate是加载指定的模板
AddDocument是给文档模板添加指定的模板
那么add跟remove是成对出现的
RemoveDocument是从文档模板列表中删除文档
再比如说GetFirstDocPosition是获得与文档模板相关的第一个文档的位置
GetNextDoc是获得文档及下一个文档
CreateNewDocument是建立文档
CreateNewFrame是建立包含文档和视图的框架窗口
OpenDocumentFile是打开由路径名指定的文档
CloseAllDocument是关闭所有文档
SetDefaultTitle这是显示文档窗口的标题栏中默认的标题
SaveAllModified是查询文档模板的修改状态
并存储与之关联的所有文档
我们再介绍CFrameWnd类
CFrameWnd类在文档视图结构中也是起着举足轻重的作用
CFrameWnd类往往用于创建应用程序的主窗口
因为它能很好地支持系统菜单和控制条
为此定义了大量的成员函数和变量
在编写文档视图结构的应用程序时
CFrameWnd作为主窗口管理视图和文档对象
视图对象和控制条都成为CFrameWnd的子窗口
它们分享客户区
其位置被CFrameWnd有效的排列
所以我们说CFrameWnd直接支持单文档
而对于多文档
使用其派生的CMDIFrameWndEx或者CMDIChildWndEx这些类
那为了管理控制条和视图
CFrameWnd为几个窗口消息建立了消息映射
专门进行处理
比如说OnInitMenuPopup
那么这是处理WM_INITMENUPOPUP消息的
设置弹出菜单的各个项目的启用和禁止状态
OnEnterIdle是处理WM_ENTERIDLE消息的
设置状态条的空闲时提示消息
OnMenuSelect是处理WM_MENUSELECT消息的
当某菜单项被选择时更新状态条的显示
OnToolTipText是处理TTN_NEEDTEXT通知消息
显示工具条的工具提示
这是更新状态条的键盘状态指示器的信息
这是更新控制条的启用禁止状态
如工具条的按钮
OnSize这是WM_SIZE的窗口消息
调用RecalcLayout排列客户区空间及视图
然后OnHScroll和OnVScroll
就是滚动条消息了 水平垂直滚动条
OnClose就是关闭消息了
存储并关闭文档
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接