win32编程 -- 系统菜单及右键菜单

她开玩笑地说了句:挺可惜的,我的青春平平淡淡,站在她身旁的男生红着眼眶:你惊艳了我至少三年。。。

----网易云热评

一、修改系统菜单项

1、在create消息中处理

 case WM_CREATE:              获取系统菜单(hWnd);              break;

2、系统菜单的修改

AppendMenu添加

DeleteMenu删除

void 获取系统菜单(HWND hWnd){       //获取系统菜单句柄,false表示现在的句柄       HMENU 系统菜单句柄 = GetSystemMenu(hWnd, FALSE);       //删除或增加菜单项       for (int i = 0; i < 6; i++)       {              DeleteMenu(系统菜单句柄, 0, MF_BYPOSITION);//根据索引删除       }       AppendMenu(系统菜单句柄, MF_SEPARATOR, 0, L"");       AppendMenu(系统菜单句柄, MF_STRING, 1001, L"哎呦");}

3、系统菜单命令响应

WM_SYSCOMMAND响应菜单命令WPARAM的LOWORD是命令IDcase WM_SYSCOMMAND:              系统菜单消息处理(hWnd, wParam);              break;void 系统菜单消息处理(HWND hWnd,WPARAM wParam){       switch (LOWORD(wParam))//获取被点击系统菜单项id       {       case 1001:              MessageBox(hWnd, L"哎呦", L"aiaiaiyoyo", MB_OK);              break;       }}

二、右键弹出菜单

1、创建菜单右键菜单是一个弹出式菜单,使用CreatePopupMenu创建。 

HMENU 菜单句柄 = CreatePopupMenu();

2、增加菜单项

AppendMenu(菜单句柄,MF_STRING,1002,L"哎");       AppendMenu(菜单句柄, MF_SEPARATOR, 0, L"");       AppendMenu(菜单句柄, MF_STRING, 1003, L"呦");

3、显示弹出式菜单

TrackPopupMenu(菜单句柄, TPM_CENTERALIGN | TPM_VCENTERALIGN, LOWORD(lParam),  HIWORD(lParam), 0, hWnd, NULL);BOOL TrackPopupMenu(       HMENU hMenu,      //菜单句柄       UINT uFlags,             //显示方式       int x,                   //水平位置,屏幕坐标系       int y,                   //垂直位置,屏幕坐标系       int nReserved,           //保留,必须0       HWND hWnd,        //处理菜单消息的窗口句柄       CONST RECT* prcRect //NULL,忽略); TrackPopupMenu是阻塞函数

4、命令处理WM_COMMAND,与窗口菜单一致 如果TrackPopupMenu设置了TPM_RETURNCMD选项,那么点击的菜单项ID通过函数的返回值获取。 

不设置的情况

case WM_COMMAND:              右键消息处理(hWnd,wParam);              break;void 右键消息处理(HWND hWnd,WPARAM wParam){       switch (LOWORD(wParam))       {       case 1002:              MessageBox(hWnd, L"aiaiaiaiia", L"youyouyou", MB_OK);              break;       }}

设置情况

BOOL ret=TrackPopupMenu(菜单句柄, TPM_CENTERALIGN |  TPM_VCENTERALIGN|TPM_RETURNCMD, pt.x, pt.y, 0, hWnd, NULL);       switch (ret)       {       case 1002:              MessageBox(hWnd,L"没有command消息",L"aa",MB_OK);              break;       }

4、菜单项的状态 WM_INITMENUPOPUP,按照弹出菜单处理

三、菜单处理位置

1、鼠标右键抬起 

WM_RBUTTONUP 鼠标右键消息窗口坐标系坐标,要使用需要转换成屏幕坐标系ClientToScreen 客户端坐标转屏幕坐标ScreenToClient        POINT pt = {0};       pt.x = LOWORD(lParam);       pt.y = HIWORD(lParam);       ClientToScreen(hWnd, &pt);

2、鼠标右键抬起后,不用坐标转换

WM_CONTEXTMENU     WParam - 右键点击的窗口句柄     LPARAM - LOWORD X坐标,屏幕坐标系                         HIWORD Y坐标,屏幕坐标系     WM_CONTEXTMENU消息是在WM_RBUTTONUP消息之后产生。void 右键抬起后(HWND hWnd,LPARAM lParam){       //1、创建右键菜单       HMENU 菜单句柄 = CreatePopupMenu();       //2、增加菜单项       AppendMenu(菜单句柄, MF_STRING, 1002, L"哎");       AppendMenu(菜单句柄, MF_SEPARATOR, 0, L"");       AppendMenu(菜单句柄, MF_STRING, 1003, L"呦");       //3、显示右键菜单       //坐标出现在垂直水平中央       BOOL ret = TrackPopupMenu(菜单句柄, TPM_CENTERALIGN | TPM_VCENTERALIGN |  TPM_RETURNCMD,  LOWORD(lParam),  HIWORD(lParam), 0, hWnd, NULL);       switch (ret)       {       case 1002:              MessageBox(hWnd, L"没有command消息", L"aa", MB_OK);              break;       }}

欢迎关注公众号:顺便编点程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值