c++ - 如何更改菜单项文本?

标签 c++ winapi visual-c++

我需要在运行时更改菜单项文本。我尝试使用 GetMenuItemInfo() 和 SetMenuItemInfo():

case WM_NOTIFYICONMSG:
    switch (lParam)  {
    case WM_LBUTTONDBLCLK:
        someAction();
        break;
    case WM_RBUTTONDOWN:
    {
        POINT point;
        GetCursorPos(&point);

        HMENU hMenu;
        HMENU hMenuTrackPopup;

        hMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU));
        if (hMenu) {
            MENUITEMINFOA menuitem = { sizeof(MENUITEMINFOA) };
            GetMenuItemInfoA(hMenu, IDM_EXIT, false, &menuitem);
            menuitem.dwTypeData = "New text here";
            SetMenuItemInfoA(hMenu, IDM_EXIT, false, &menuitem);
            hMenuTrackPopup = GetSubMenu(hMenu, 0);
            TrackPopupMenu(hMenuTrackPopup, 0, point.x, point.y, 0, hWnd, NULL);
            DestroyMenu(hMenu);
        }
    }
        break;
    default:
        break;
    }
    break;

但它不起作用,文本没有改变。我做错了什么?如何实现?

最佳答案

正如@HansPassant 指出的那样,解决方案是:

You are not using MENUITEMDATA correctly, you forgot to set the fMask member. Read the MSDN article for the struct for details

然后:

add menuitem.fMask = MIIM_TYPE | MIIM_DATA; and it works well

我不能把这个解决方案归功于我,但我在这里提供它,以便下一个需要该问题答案的人可以轻松找到它,而无需解析评论部分

关于c++ - 如何更改菜单项文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24942087/

相关文章:

C++ 使用 std::string, std::wstring 作为缓冲区

c++ - 使用 C++ 将数据连接并插入到 MS Access 表中

c++ - 如何使用裸新初始化智能点?

c++ - 如何使用 cppcheck 忽略某些文件类型?

c++ - 我应该使用指针还是 move 语义来传递大块数据?

c++ - 如何否定 lambda 函数结果

c++ - 如何计算图像的间距 Visual Studio

c++ - 使用按位或代替 std::max 来调整缓冲区大小

c++ - 如何在 Windows 中更改语言键盘布局 (c++)

c++ - 不直接使用字符串时的CreateProcess @Unhandled异常