如何更改菜单项文本?
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 部分
【讨论】:
以上是关于如何更改菜单项文本?的主要内容,如果未能解决你的问题,请参考以下文章