【发布时间】: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 作为标准。
标签: c++ winapi visual-c++