<Win32_16>来看看标准菜单和右键菜单的玩法
日常应用中,菜单主要分为两种:(1) 标准菜单(处于应用程序菜单栏处的菜单) (2)右键快捷菜单
几乎你所见过或使用过的软件中,都有它俩儿
为应用程序添加它们的基本步骤:
(1)用代码或者IDE创建一个菜单资源
(2)加载、显示菜单菜单
(3)如果是右键菜单,在获取右键坐标按下的坐标时,还应该将它转换为屏幕坐标(ClientToScreen) —— 后面有原因解析
(4)在WM_COMMANG消息中相应对应的操作
下面,我就来讲一下标准菜单和右键菜单的创建以及用法
(1)首先,不管是标准菜单还是右键菜单,都需要先创建,创建的方式有两种:
1>代码方式,用CreateMenu函数来创建(为了方便,我这里就不用代码方式了,我选择IDE创建方式)
2>用IDE提供的创建方式(就是添加资源,和添加位图资源是一回事儿,这里就是新建菜单)
(2)我这里,为了区分,为标准菜单和右键菜单各自创建了一个菜单资源
1>标准菜单
菜单ID为IDR_MENU
子菜单项椭圆ID为IDM_ELLIPSE
子菜单项矩形ID为IDM_RECT
子菜单项退出ID为IDM_EXIT
2>右键菜单
右键菜单ID为IDR_CONTEXTMENU
子菜单项椭圆ID为IDCM_ELLIPSE
子菜单项矩形ID为IDCM_RECT
子菜单项退出ID为IDCM_EXIT
(3)下面就是两种菜单的添加方式
1>标准菜单的添加方式很简单,因为窗口中预留了一个菜单栏,就是来放菜单的,具体代码如下:(在注册窗口类之间修改lpszMenuName参数)
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);//加载标准菜单2>右键菜单的添加方式
主要是使用TrackMenu这个函数来显示,来看看msdn:
BOOL TrackPopupMenu(HMENU hMenu,//菜单句柄
UINT uFlags,//位置标记
int x, //x坐标
int y, //y坐标
int nReserved,//必须为0,不用管
HWND hWnd, //拥有右键菜单的窗口的句柄
HWND prcRect//忽略(NULL)
);具体代码:(在右键按下消息中显示右键菜单)
case WM_RBUTTONDOWN:
ptCm.x = LOWORD(lParam);//设定右键菜单坐标
ptCm.y = HIWORD(lParam); /*
当前获取的坐标是客户区坐标 , 而TrackPopupMenu函数显示的坐标是屏幕坐标
因此 , 需将ptCm转换成屏幕坐标(否则显示位置不正确)
*/
ClientToScreen(hwnd, &ptCm); //显示右键菜单
TrackPopupMenu(hSub,
TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON,
ptCm.x, ptCm.y,
0, hwnd, NULL);
return 0;
(4)消息处理,这里为了方便,我给标准菜单和右键菜单一种同样的相应方式
具体代码如下:
case WM_COMMAND:
//响应菜单消息
switch(LOWORD(wParam))//判断子菜单项的ID
{
//菜单栏和右键菜单的子项相同 , 因此对应执行相同操作
case IDM_ELLIPSE:
case IDCM_ELLIPSE:
isEllipse = TRUE;
InvalidateRect(hwnd, NULL, TRUE);
break;
case IDM_RECT:
case IDCM_RECT:
isEllipse = FALSE;
InvalidateRect(hwnd, NULL, TRUE);
break;
case IDM_EXIT:
case IDCM_EXIT:
if(IDYES == MessageBox(hwnd, TEXT("确定离开吗?"), TEXT("提示"), MB_YESNO))
SendMessage(hwnd, WM_CLOSE, wParam, lParam);
}
return 0;
下面来看看运行效果:
<Win32_16>来看看标准菜单和右键菜单的玩法的更多相关文章
- DIY福音:Firefox菜单及右键菜单ID大全
每一个折腾Firefox的Diyer都是上辈子折翼的天使,致自己! 打磨Firefox界面的时候最多的就隐藏一些平常根本用不上的一些菜单,常规的做法就是安装DOM Inspector扩展右键查找大法寻 ...
- Open With Atom添加到右键菜单/从右键菜单移除
1.进入Settings 快捷键ctrl+shift+p,输入settings后回车 2.切换到System选项卡 3.通过勾选/取消勾选以下选项实现添加/移除右键菜单 √ Show in file ...
- 【MFC】VS2013 动态创建快捷菜单(右键菜单)
参考 http://blog.csdn.net/csdnzhwk/article/details/47395639 参考 http://blog.csdn.net/jiadabin/article/d ...
- 跟我一起玩Win32开发(6):创建右键菜单
快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜单项.这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单. 右键菜单的好处就是方便,它经常和我们 ...
- pyqt5-为QListWidget添加右键菜单
如何在pyqt5下为QListWidget添加右键菜单? 能百度到的均是pyqt4下的,有些貌似并不好用. 在尝试了很多方法后,下面贴出可用的方法: from PyQt4 import QtCore, ...
- 【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)
这周没什么时间,一开始就在忙一些CefSharp的事情,Win10的研究就放了下来,CefSharp的资料挺少的,但好在是开源的,可以我们便宜的折腾.因为两个的内容都不多,我就合成一篇文章啦. 这还里 ...
- 【技术贴】7-zip 7z关联右键菜单后右键不弹出菜单的解决办法
解决7z,7zip右键菜单 失效 右键菜单 无法弹出右键菜单 不正常 右键菜单 sb等各种疑难杂症. 1.首先先去7z的选项里面把右键关联给设置了. 用的好好的7z,正吃着火锅唱着歌忽然发现右键单文件 ...
- Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单
{================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...
- 关于MFC主菜单和右键弹出菜单
一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...
随机推荐
- BroadcastReceiver自学笔记
1. 使用步骤: 1.1 声明Intent Intent intent = new Intent("name");------静态常用 IntentFilter filter = ...
- DataTable去除重复行
//抽取dt中的特定列"Region","Cur","Year"组合成新的dat DataTable dat = dt.DefaultVie ...
- JavaSE复习日记 : java包机制
这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; ...
- [ 转 ]jquery的ajax和getJson跨域获取json数据
目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...
- iso-开发基础知识-5-适配器
个人学习总结仅供参考:欢迎拍砖 1.适配器:用于连接两种不同种类的对象. 2.分为2种:类适配,对象适配. 3.委托(Delegate)模式属于对象适配器: 4.何时使用适配器模式 书中的这幅图更好的 ...
- php 求水仙花数优化
水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数.(比如:1^3+5^3+3^3 = 153) 水仙花数又称阿姆斯特朗数. 三位的水仙花数有4个:153, ...
- ExtJs004define定义类
Ext.onReady(function () { //在Ext中如何去定义一个类: Ext.define(className , properties , callback) Ext.define( ...
- 注册表缺失导致Windows Server 2008 R2时钟服务W32time不能自启
参照@飘云 http://blog.csdn.net/piaoyunqing/article/details/6323647 的文章. 测试环境中有一台Windows Server 2008 R2的虚 ...
- 下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s="a"+"b"+"c"+"d";
javac 编译可以对字符串常量直接相加的表达式进行优化, 不必要等到运行期去进行加法运算处理, 而是在编译时去掉其中的加号, 直接将其编译成一个这些常量相连的结果.题目中的第一行代码被编译器在编译时 ...
- [Jobdu] 题目1367:二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...