当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第8章 在MFC中创建应用程序的资源 > 8-3 快捷菜单的创建及其应用 > 8-3
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
下面呢,我们介绍快捷菜单的创建
大家平常在操作应用程序的时候
除开在程序的主菜单上进行一些操作
实际上通过单击鼠标右键
经常会弹出一个快捷菜单
那么,我们现在来讨论快捷菜单
我们呢,看一下快捷菜单怎么增加
我们在资源视图里面添加一个菜单
插入一个Menu,这个实际上缺省地叫IDR_MENU_1
这就是我们添加的
这时候,我们把它的ID改为IDR_MENU_POP
IDR_MENU_POP就是我们要增加的
大家注意,这个IDR_MAINFRAME是我们刚才的主菜单
我们做得操作菜单的显示和颜色选择
现在我们IDR_MENU_POP
这个时候我们给它一个名字叫POP
同样,我们增加显示,然后我们增加颜色
颜色里面同样是红色绿色蓝色
在这个地方也可以加上&R 绿色 蓝色
这时候我们给它添加了这么一个菜单
先保存一下
然后我们要把ID设为前面的ID
因为快捷菜单的操作和主菜单的操作是一致的
所以我们也要设成ID_OPER_SHOW
对于颜色,我们仍然设成红色
绿色一样设成绿色
蓝色一样显示为蓝色
这样这几个都显示好了
我们把快捷菜单制作完后
这个快捷菜单还不能够操作
这里面需要使用CMenu类
这个类比较特殊,它继承自CObject类
而不像大部分Windows可视组建继承自CWnd类
因此在一些需要CWnd类的场合,无法使用CMenu类来完成工作
CMenu类提供了许多处理菜单和菜单项的方法
这些方法分别是
构造方法、菜单操作方法、菜单项操作方法和虚拟方法
比如说CreateMenu(),创建一个空菜单并把它附加到CMenu对象上
CreatePopupMenu(),创建一个弹出式菜单并把它附加到CMenu对象上
DestroyMenu(),是去掉附加到Cmenu对象上的菜单并释放该菜单占的内存
LoadMenu(),是从可执行文件装入菜单资源并把它附到CMenu对象上 等等
菜单操作方法中的DeleteMenu()和TrackPopupMenu()是用来处理菜单的顶层操作
DeleteMenu()删除某个特定菜单项
如果被删除的菜单项有相关的弹出式菜单
那么这个弹出式菜单的局并也要被删除并释放内存
TrackPopupMenu()在一个POINT结构所指定的位置显示一个快捷菜单
这里面有几个方法
比如AppendMenu()是把一个新项加到给定的菜单的末端
比如CheckMenuItem()是在弹出式菜单中
把一个校验标记放到下一个菜单项或从一个菜单项中取消一个校验标记
EnableMenuItem()是激活或停止一个菜单项
GetMenuItemCount()是获取菜单项的个数
以及GetMenuItemID()是为设置在指定位置的菜单项获得菜单项标识符
GetMenuSate()是获得指定菜单项的状态
GetMenuString()是获得指定菜单项的标记
以及GetSubMenu()是获得指向弹出式菜单的指针
当然还有InsertMenu()、ModifyMenu()、RemoveMenu()
这些通过字面的含义大家都能清晰地知道他的功能
加载快捷菜单,我们是通过单击鼠标右键来响应的
单击鼠标右键后弹出一个快捷菜单
所以我们要定义两个参数
第一个参数CMenu m_PopMenu
这时用来定义的快捷菜单
然后定义一个快捷菜单的子菜单
那么通过这两个变量来操作
我们来操作一下
我们在它的头文件里面
在刚才增加的这些变量后面
可以增加这两个变量
CMenu类的对象
一个用来标识快捷菜单
一个用来标识快捷菜单的子菜单
然后我们通过视图类里
响应一个鼠标右键的消息
我们选择鼠标右键
这时候右键的消息就传过来了
然后我们就可以编辑代码
我们先回到视图CView类的构造函数
在CView类的构造函数里
我们要把快捷菜单进行加载
我们在这个地方加上加载菜单
这个加载菜单是IDR_POP_SHOW
IDR_POP_SHOW就是我们创建的快捷菜单
当他不再需要的时候
我们要销毁菜单,释放菜单资源
释放的工作由析构函数来完成
所以我们在析构函数里增加这么一行代码
m_PopMenu 弹出式菜单的DestroyMenu()
我刚才响应了一个鼠标右键单击的消息OnRButtonDown
我们现在要编写具体的代码
我们看下它的代码功能是什么样的
首先GetSubMenu是获得一个子菜单
0代表第一个子菜单
然后我们要考虑是不是可以显示
如果是真,那么显示check,如果是假就是uncheck
就是子菜单前面的选中标志
那么在这里CheckMenuItem对IDR_POP_SHOW快捷菜单
通过BYCOMMAND选项命令,去选择是否处于check状态
然后我们要进行将坐标由客户坐标转化为屏幕坐标
因为我们这里要进行鼠标的定位
鼠标在任何一个位置
单击鼠标右键都要弹出快捷菜单
所以我们这里考虑ClientToScreen
将坐标由客户坐标转化为屏幕坐标
然后我们用前面介绍的TrackPopupMenu
这个就是this指针指向当前的环境
这是当前的x,y坐标
这里定义了一个宏是用来对其的
在快捷菜单显示出来的时候靠左显示
这个快捷菜单
我们看下这个程序能不能运行
由于我们把快捷菜单的每个菜单项
都给成了原来主菜单的菜单项的ID
所以这时候就能正常地运行
红色 绿色 蓝色
大家请注意
我刚才是把快捷菜单的每一个菜单项的ID
都改成了主菜单一致的ID
如果刚才没有做这个工作
程序也能运行
快捷菜单也能弹出
但是选择哪一个菜单项的时候
它是不能运行的
因为什么呢
因为系统缺省的ID
我们并没有对系统缺省的ID做消息响应
我们只对原来的显示
红色 绿色 蓝色 Green Blue Red做响应
如果不把快捷菜单的菜单项的ID
跟主菜单的ID,我们刚才创建的操作下面的菜单项的ID等同起来
那么快捷菜单弹出来的也不能工作
好,我们这个例子就介绍到这里
-讨论实录
--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
-第三次作业及答题链接