当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第8章 在MFC中创建应用程序的资源 > 8-1&2 资源的应用以及菜单资源的使用 > 8-1-2
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
我们来看一下问题出在什么地方
OnDraw里面我们把这段代码写上
就是如果显示为真
那么就显示
就设置颜色并显示内容
那这时候 我们编译一下看看啊 会不会出错
这个地方大家是要注意的
这里发现出错
是什么原因
因为系统生成过程中它这里给加了一个注释
这里一加上注释后 实际上这个pDC是不起作用的
所以这个注释是系统加上的注释
系统加上的注释反而影响了程序的运行
因为很多初学者没有注意到
系统会把这个pDC给加上注释
那什么原因加上注释
说实在我们也不清楚
因为按道理这个地方是不应该加注释的
那我们就给它去掉就行了
这时候我们可以看到
程序执行的时候出现了一个“Hello World!”
但是 我们在选择颜色操作的时候底下的颜色是不能操作的
现在那么显示 这个显示菜单项也不能操作
那就是说现在单纯地显示一个红色的“Hello World!”
菜单项没有起作用
我们先把程序关闭
那由于它在构造函数里面定义了颜色索引值是0
显示内容是“Hello World!”
而且显示状态是TRUE
所以刚才的话完全是构造函数在起作用
但是菜单项并没有起作用
所以的话我们现在要考虑一个问题
如果程序编译运行可以看到程序输出一行红色的字符串“Hello World!”
但颜色菜单项还没有起作用为什么?
那下面我们将介绍如何通过菜单项来控制程序
在介绍菜单项的响应时
我们必须先了解几个消息响应的机制
这几个机制包括COMMAND消息的响应
ON_COMMAND_RANGE对COMMAND消息的响应
以及ON_UPDATE_COMMAND_UI_RANGE对UPDATE_COMMAND_UI消息的响应
那我们一个一个来介绍
对COMMAND消息的响应
应该说比较简单
因为我们对显示ID_OPER_SHOW这个菜单项
添加COMMAND消息响应之后
我们会看到
在视图.h文件里面增加了OnOperShow()
那我们就来增加一下
我们就来增加这个消息响应
添加事件处理程序
这个OnOperShow
我们就用系统自动生成的
但是在这个类列表的地方我们要注意
因为我们响应的是视图类
所以的话我们要找到CMy8_1View这个东西
它缺省的是CAboutDlg
大家不要闭着眼睛就添加编辑
那么这里就全错了
这个类要找到
那么这个时候
我们添加编辑程序
这里出现了OnOperShow()
那这个时候大家就看到
在这个头文件里
在我们增加的变量后面
多了一个OnOperShow()这个函数
我们看一下cpp文件
原来可以看到
在这个消息映射里面多了一个On_COMMAND这个地方
ID_OPER_SHOW这是我们菜单项显示的ID
它绑定的是OnOperShow()函数
那么这个就是它的机制
然后
我们要为OnOperShow()这个函数编写它的代码
在这个地方显示
那么也就是说
如果这个是真那么就变成假
因为显示完你再按就不显示
不显示再按就是显示
所以显示的时候
就是给它变非就可以了
那我们运行一下这个程序
这时候
这个显示运行下就不显示
再按一下就显示
那么这菜单项就显示可以操作的
但是颜色选择还不能操作
下面我们开始说UPDATE_COMMAND_UI消息的响应
UPDATE_COMMAND_UI消息是在窗口将要会在菜单项的时候产生
那么刚才例子里面
我们仅仅实现了显示菜单项来控制是否显示
似乎还不够
如果显示菜单项能够配合主程序体现当前是否显示的状态
可能会更好一些
就像一个文本编辑软件
菜单上是“10号字”、“12号字”的功能
如果不在菜单上标识出来
那么使用者可能搞不清当前的字是多大的
所以我们这时候为ID_OPER_SHOW再添加一个UPDATE_COMMAND_UI的消息
那么自动生成的函数就是OnUpdateOperShow
这个时候我们看一下它有什么变化
我们为一个菜单项
同样一个ID我们可以响应不止一个消息
那这时候我们响应的消息是UPDATE_COMMAND_UI消息
那么请大家注意
也是选择的这个View
选择这个代码
这个消息
我们来编辑代码
我们要做的内容就是SetCheck
对这个状态是真和假进行SetCheck
那这样的话 我们执行一下
就是说如果这个值显示是真的情况下
我这个SetCheck的地方就多了一个勾
如果不显示
那么它就m_bShow是假
假的话SetCheck就没有了
是假的情况下这里就不显示了
真的情况下就显示
那么这时候如果再按一下显示这就出来了
出来了它的状态就是真
所以用显示的状态来设置SetCheck的状态
用勾这个符号来表示现在的显示状态
刚才用的是SetCheck
实际上也可以用Enable
如果我们用SetRadio
而不用SetCheck
那么这个时候前面显示的就是一个点
而不是打对勾
如果用SetText的话
就是通过这个可以用来设置Caption的属性
那么也就是这个属性是菜单项里面显示的Caption的内容
那比如说这个操作里面显示
这个显示两个字就是Caption里面的内容
实际上我们刚才制作菜单的时候
大家知道显示这两个字是在它的属性Caption里面完成的
我们回过头来看一下
在这个头文件里面
我们同样响应的OnUpdateOperShow这个消息
那么它在这个消息映射区域
BEGIN_MESSAGE_MAP的地方
我们同样看到ON_UPDATE_COMMAND_UI
它将OPER_SHOW的ID跟OnUpdateOperShow这个函数连接起来
因此我们才将下面编写OnUpdateOperShow这个函数
那么这个参数是自动生成的
实际上这里面就是一个SetCheck
我们下面来介绍ON_COMMAND_RANGE对COMMAND消息的响应
ON_COMMAND_RANGE是为处理具有连续ObjectID的菜单项提供了方便的途径
那前面我们看到只响应了三种颜色
如果三种颜色的时候
红绿蓝我们可以一个一个列出来
那如果有100种颜色可供选择
是否要定义100个响应函数
我们可以使用ON_COMMAND_RANGE
这就涉及到ID范围的上下界及当前的ID
那么也就是说
在Resource.h中若干个ID不连续
如果作为颜色响应
要把它作为一个连续的ID进行处理的话
要手工改为连续的
那我们看一下Resource.h这文件
他这里定义了很多的ID值我们不管了
我们只看看这三个颜色的ID
它映射的整形数32777、32778、32779
那么这三个是连续的
如果三个不连续你要将它改为连续
刚才说到我们那个编译环境里面
并不是对所有的操作都能支持
我们的类向导里面本身就不支持ON_COMMAND_RANGE消息的自动映射
因此我们只能手工添加消息的处理
我们前面已经熟悉了这两个映射
那只要在这两个的下面增加一个我们自己想写的消息映射函数
这个函数叫做OnOperColorChange
这个函数名是我们自己起的
这里面是UINT类型的ID
那么这ID是用来标示颜色的
是个颜色索引值
这个时候我们在刚才映射的两个函数后面增加一行OnOperColorChange
那么我们已经熟悉了它的机制
所以我们就在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP里面
我们要响应一个ON_COMMAND_RANGE
我们要在这消息映射模块里面增加我们自己的消息映射模块
ON_COMMAND_RANGE这里面包含了三个参数
第一个是ID范围的最小值
第二个是ID范围的最大值
就是最大和最小之间
第三个参数就是要处理的消息处理函数OnOperColorChange
那么这个时候
我们编写的这个消息响应ON_COMMAND_RANGE
然后 我们要编写OnOperColorChange这个函数了
那么这个函数我们仍然是在View视图里面编写
那这样的话我们就要跟前面的照猫画虎
编写一个CMy8_1View的这么一个函数
这个类下面的方法叫OnOperColorChange
那么这里面有一个Index的值是什么
就是你选择上的值跟第一个值相减
因为Index的值是0、1、2
你选上的值如果是红色
那么红色就跟这红色ID相减 它的值就是0
那么Index就是0
如果绿色的话
绿色跟它相减 跟红色相减
因为它的索引值 绿色是1 红色是0
那么减出来就是1
同理蓝色的话 索引值是2
2的索引值跟它的索引值0相减
那么这就是2
Index值就是2
2完了 那么我们的颜色就是按2的颜色
通过前面构造函数
这个Index大家都知道的
如果变成2的话就是Color[2]
Color[2]是蓝色
然后Invalidate就是刷新
那这样的话我们把程序运行一下
我们这时候看一下 这个颜色是可以操作的
比如说我先来 缺省的是红色
我选择绿色、蓝色 再给它变成红色
然后不显示
如果不显示 你颜色怎么选都没用
显示完后因为我刚才的选的蓝色 选绿色
那么我们这个例子就可以到这
还没讲完
我们做完这个东西后
我们要考虑一个ON_UPDATE_COMMAND_UI_RANGE
那么这个是图形化用户界面又是无法给你完成的
我们又得手工完成
那怎么办
手工加入仿照ON_COMMAND_RANGE的过程
加入ON_UPDATE_COMMAND_UI_RANGE这个宏
那这时候我们先在类的定义头文件中增加这么一句
也是afx全局的
那我们增加的是OnUpdateOperColorChange
这个参数跟OnUpdateOperShow一样
用pCmdUI
然后由于有了这个 类里面定义了这个方法
那么这一个方法是跟哪一个ID进行映射
在View里面消息映射的地方
我们加入这一个ON_UPDATE_COMMAND_UI_RANGE
跟类似与ON_COMMAND_RANGE一样
我们增加这么一个
然后它的ID范围
第一个是红,最后一个是蓝
跟前面一样
然后它响应的是OnUpdateOperColorChange
既然响应的这个就是当颜色变化时颜色变化的提示
那这样的情况下我们就要编写一个函数
编写什么函数
编写OnUpdateOperColorChange这个函数
我们仍然在最后写
我们编写CMy8_1View下面OnUpdateOperColorChange
这个函数里面
我们这时候就是对颜色选项 我们选上的时候
我们前面用的是SetCheck
我们这里为什么不用SetCheck
而用SetRadio
这是为了让大家多接触一下不同的表示方法
那这里面我们仍然用它的ID值
就是当前子菜单的ID值减去红色的索引值
那么这样生成的索引值就是0、1、2
那么选上哪一个就在前面多了一个圆点
那这样我们把程序运行一遍
大家看这时候程序选上的是红色
因为Index是红色
如果是绿色的话 那么绿色前面就有个圆点
圆点提示
前面显示因为打勾 有符号显示
实际上这里也可以用打勾符号
或者这里用圆点
这样用不同的方式只是通过例子告诉大家不同的样式的使用方法而已
大家知道用的这个pCmdUI
由于CCmdUI类的成员m_nID就是调用当前的菜单项ID
所以的话OnUpdateOperColorChange函数就没有nID这个参数
所以这个大家要了解一下
我们第一个例子先做到这
-讨论实录
--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
-第三次作业及答题链接