日常应用中,菜单主要分为两种:(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. 【译】html5游戏入门

    [译]html5游戏入门 原文链接 简介 如果你想用canvas做个游戏,那么来对地方了. 但是但是你至少知道javascript怎么拼写(╯‵□′)╯︵┻━┻ 既然没问题,那先来玩一下或者下载 创建 ...

  2. 关于在App_Code文件夹自定义类中Session无法使用

    由于前台页面需要调用App_Code中自定义类的函数,但在自定义类中找不到Session,解决方法如下: 新建一个类session,并自己定义函数GetSession(),引用命名空间 System. ...

  3. 块对象block小结

    blcok的形式 ^(参数列){主体} block作为返回值

  4. tomcat部署java项目

    tomcat部署java项目 1.启动tomcat 进入到tomcat安装目录下的bin #cd /opt/tomcat/bin #./startup.sh // 执行重启命令 2.重建一个新目录导入 ...

  5. codeforces 535D. Tavas and Malekas KMP

    题目链接 又复习了一遍kmp....之前都忘光了 #include<bits/stdc++.h> using namespace std; #define pb(x) push_back( ...

  6. vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板)

    vs 2013下自定义ASP.net MVC 5/Web API 2  模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ...

  7. nginx filter

    server { listen 80; server_name g.zcdn.com; index index.html; location / { proxy_cache cache_go; pro ...

  8. 老男孩python第六期

    01 python s6 day7 上节回顾02 python s6 day7 SNMP使用03 python s6 day7 大型监控架构讲解04 python s6 day7 Redis使用05 ...

  9. HDU 3374 String Problem (KMP+最小最大表示)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3374 [题目大意] 给出一个字符串,求出最小和最大表示是从哪一位开始的,并且输出数量. [题解] ...

  10. jquery 使用ajax调用c#后台方法

    $.ajax({                         type: "get",                         cache: false,        ...