一、修改系统菜单项
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; } }