首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ win32动态菜单-选择了哪个菜单项

c++ win32动态菜单-选择了哪个菜单项
EN

Stack Overflow用户
提问于 2011-09-25 04:33:37
回答 2查看 6.1K关注 0票数 5

我有一个win32应用程序(c++),它的上下文菜单绑定到右键单击notify图标。菜单/子菜单项是在运行时动态创建和更改的。

代码语言:javascript
复制
 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"); 

在上面的代码中,hDevices和hChannels是动态生成的子菜单。动态菜单的生成方式如下:

代码语言:javascript
复制
   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");

有没有办法知道哪个菜单项被点击了,而不必定义每个子菜单项自己的ID (上面代码中的IDM_DEVICE)?在想要检测到用户点击了子菜单IDM_DEVICE,并且他点击了该子菜单中的第一项(测试1)。

我想要达到这样的效果:

代码语言:javascript
复制
  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;          
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-25 04:57:25

尝试以下操作:

代码语言:javascript
复制
MENUINFO mi;
memset(&mi, 0, sizeof(mi));
mi.cbSize = sizeof(mi);
mi.fMask = MIM_STYLE;
mi.dwStyle = MNS_NOTIFYBYPOS;
SetMenuInfo(hDevices, &mi);

现在,您将获得WM_MENUCOMMAND而不是WM_COMMAND。菜单索引在wParam中,菜单句柄在lParam中。注意,只处理已知菜单的消息,并将其余的消息传递给DefWindowProc。代码将与以下代码类似:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2017-01-06 20:40:59

还可以使用带有TPM_RETURNCMD | TPM_NONOTIFY标志的TrackPopupMenuEx(),并获得所选菜单项的id,而不必通过WM_MENUCOMMAND

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7541750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档