ble*_*jzz 5 c++ winapi menu selected submenu
我有一个win32应用程序(c ++),右键单击通知图标绑定上下文菜单.菜单/子菜单项在运行时动态创建和更改.
InsertMenu(hSettings, 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hDevices, L"Setting 1");
InsertMenu(hSettings, 1, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hChannels, L"Setting 2");
InsertMenu(hMainMenu, 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT_PTR) hSettings, L"Settings");
InsertMenu(hMainMenu, 1, MF_BYPOSITION | MF_STRING, IDM_EXIT, L"Exit");
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,hDevices和hChannels是动态生成的子菜单.动态菜单生成如下:
InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 1");
InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 2");
InsertMenu(hDevices, i, style, IDM_DEVICE, L"Test 3");
Run Code Online (Sandbox Code Playgroud)
有没有办法知道哪个项目被点击而不必定义每个子菜单项它自己的ID(上面代码中的IDM_DEVICE)?想要检测用户点击子菜单IDM_DEVICE并且他点击了此子菜单中的第一个项目(测试1).
我想得到这样的东西:
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_DEVICE: // user clicked on Test 1 or Test 2 or Test 3
UINT index = getClickedMenuItem(); // get the index number of the clicked item (if you clicked on Test 1 it would be 0,..)
// change the style of the menu item with that index
break;
}
Run Code Online (Sandbox Code Playgroud)
请尝试以下方法:
MENUINFO mi;
memset(&mi, 0, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIM_STYLE;
mi.dwStyle = MNS_NOTIFYBYPOS;
SetMenuInfo(hDevices, &mi);
Run Code Online (Sandbox Code Playgroud)
现在你将得到WM_MENUCOMMAND而不是WM_COMMAND.菜单索引将在wParam中,菜单句柄在lParam中.请注意仅为已知菜单吃掉消息,然后将剩余菜单用于DefWindowProc.代码将类似于:
case WM_MENUCOMMAND:
HMENU menu = (HMENU)lParam;
int idx = wParam;
if (menu == hDevices)
{
//Do useful things with device #idx
}
else
break; //Ensure that after that there is a DefWindowProc call
Run Code Online (Sandbox Code Playgroud)