如何更改菜单项文本?

Posted

技术标签:

【中文标题】如何更改菜单项文本?【英文标题】:How to change menu item text? 【发布时间】:2014-07-24 19:14:05 【问题描述】:

我需要在运行时更改菜单项文本。我尝试使用 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;

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

【问题讨论】:

如果函数成功,返回值非零。如果函数失败,则返回值为零。要获取扩展的错误信息,请使用 GetLastError 函数。 - 检查错误。另请注意,将 const char * 指向字符串文字在 C++11 之前已被弃用,目前是非法的。该文档也没有承诺不修改该数据。 感谢您的评论。但是 SetMenuItemInfoA() 返回 1。正如我所见,这意味着函数成功。关于指向char:如何正确设置? 您没有正确使用 MENUITEMDATA,您忘记设置 fMask 成员。有关详细信息,请阅读 MSDN 文章以了解该结构。 @HansPassant,你是对的。我添加了menuitem.fMask = MIIM_TYPE | MIIM_DATA;,它运行良好。谢谢! 为什么要使用 Ansi 函数?近 20 年来,Windows 一直支持 Unicode 作为标准。 【参考方案1】:

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

您没有正确使用 MENUITEMDATA,您忘记设置 fMask 成员。有关详细信息,请阅读 MSDN 文章了解结构

然后:

添加menuitem.fMask = MIIM_TYPE | MIIM_DATA; 效果很好

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

【讨论】:

以上是关于如何更改菜单项文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中动态更改菜单项文本

如何在 Android 中更改菜单项的文本颜色?

操作栏菜单项文本颜色

ios 更改默认共享菜单项的文本 - 复制/粘贴/删除

Android以编程方式更改导航抽屉菜单项文本

操作栏菜单项文本颜色