日常应用中,菜单主要分为两种:(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>来看看标准菜单和右键菜单的玩法的更多相关文章

  1. DIY福音:Firefox菜单及右键菜单ID大全

    每一个折腾Firefox的Diyer都是上辈子折翼的天使,致自己! 打磨Firefox界面的时候最多的就隐藏一些平常根本用不上的一些菜单,常规的做法就是安装DOM Inspector扩展右键查找大法寻 ...

  2. Open With Atom添加到右键菜单/从右键菜单移除

    1.进入Settings 快捷键ctrl+shift+p,输入settings后回车 2.切换到System选项卡 3.通过勾选/取消勾选以下选项实现添加/移除右键菜单 √ Show in file ...

  3. 【MFC】VS2013 动态创建快捷菜单(右键菜单)

    参考 http://blog.csdn.net/csdnzhwk/article/details/47395639 参考 http://blog.csdn.net/jiadabin/article/d ...

  4. 跟我一起玩Win32开发(6):创建右键菜单

    快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜单项.这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单. 右键菜单的好处就是方便,它经常和我们 ...

  5. pyqt5-为QListWidget添加右键菜单

    如何在pyqt5下为QListWidget添加右键菜单? 能百度到的均是pyqt4下的,有些貌似并不好用. 在尝试了很多方法后,下面贴出可用的方法: from PyQt4 import QtCore, ...

  6. 【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)

    这周没什么时间,一开始就在忙一些CefSharp的事情,Win10的研究就放了下来,CefSharp的资料挺少的,但好在是开源的,可以我们便宜的折腾.因为两个的内容都不多,我就合成一篇文章啦. 这还里 ...

  7. 【技术贴】7-zip 7z关联右键菜单后右键不弹出菜单的解决办法

    解决7z,7zip右键菜单 失效 右键菜单 无法弹出右键菜单 不正常 右键菜单 sb等各种疑难杂症. 1.首先先去7z的选项里面把右键关联给设置了. 用的好好的7z,正吃着火锅唱着歌忽然发现右键单文件 ...

  8. Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单

    {================================================================= 功 能: 创建 桌面.发送到....快速启动栏.开始菜单.程序菜单 ...

  9. 关于MFC主菜单和右键弹出菜单

    一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...

随机推荐

  1. 创建Java项目报错处理

    好久没用Eclipse编写Java程序了,今天创建一个Java项目的时候,老报错,错误信息如下: Implicit super constructor Object() is undefined fo ...

  2. Building Workspace速度慢的原因

    今天把ext3.0部署到web project很慢很慢,查了一下,这个当笔记. 转自http://blog.163.com/jong_cai/blog/static/87028045201311178 ...

  3. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用

    这个是给不喜欢360等提供的桌面浮动网络监控的园友准备的,NetSpeedMonitor 是一个可以在任务栏监控流量的小工具,集成在任务栏上显示,可以手动设置单位.文字大小等.还支持监控日志,相比其他 ...

  4. Hadoop经典面试题(转)

    单项选择题 1. 下面哪个程序负责 HDFS 数据存储. a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker 2. ...

  5. Java 内省机制

    一.内省 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法.JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的 ...

  6. mysql远程登录权限

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION; FLUSH PRIVILEGES;

  7. C++读写EXCEL文件OLE,java读写excel文件POI 对比

    C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...

  8. linux 在终端中打开图形化文件管理器

    虽然终端十分强大,但在少数使用终端的时候,会突然需要图形化文件管理器的帮忙. 命令: xdg-open "dir" 例如 xdg-open ./ 用图形化文件管理器打开当前文件夹 ...

  9. JAVA异常设计原则

    异常是面向对象语言非常重要的一个特性,良好的异常设计对程序的可扩展性.可维护性.健壮性都起到至关重要. JAVA根据用处的不同,定义了两类异常     * Checked Exception: Exc ...

  10. HTML5 postMessage 和 onmessage API 具体应用

    HTML5 postMessage 和 onmessage API 具体应用 随着 HTML5 的发展.了解并熟悉 HTML5 的 API 接口是很重要的.postMessage(send) 和 on ...