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

简介: 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是命令ID
case 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;
       }
}
目录
相关文章
|
5月前
Win11、Win10 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标
Win11、Win10 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标
85 2
怎样将Beyond Compare添加到系统右键菜单
怎样将Beyond Compare添加到系统右键菜单
1080 0
|
6月前
|
索引
win32编程 -- 菜单使用
win32编程 -- 菜单使用
24 1
|
6月前
Qt实现的多菜单选择界面
Qt实现的多菜单选择界面
98 0
|
6月前
win32编程 -- 模式对话框
win32编程 -- 模式对话框
38 1
|
6月前
win32编程 -- 菜单资源
win32编程 -- 菜单资源
37 1
|
6月前
win32编程 -- 无模式对话框
win32编程 -- 无模式对话框
35 0
|
6月前
Mac系统下Qt程序图标设置方法
Mac系统下Qt程序图标设置方法
107 0
Win11 右键菜单 样式 模式修改
创建文本文件 复制代码 修改后缀 .bar 双击运行
176 0
win32编程 -- 系统菜单及右键菜单
win32编程 -- 系统菜单及右键菜单
278 0