Мне нужно изменить текст пункта меню во время выполнения. Я пытаюсь использовать 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, решение:
Вы не используете MENUITEMDATA правильно, вы забыли установить член fMask. Прочтите статью MSDN для структуры для подробностей
а потом:
добавить
menuitem.fMask = MIIM_TYPE | MIIM_DATA;
menuitem.fMask = MIIM_TYPE | MIIM_DATA;
и он хорошо работает
Я не могу взять кредит на это решение, но предоставляю его здесь, чтобы следующий человек, которому нужен ответ на этот вопрос, мог легко найти его, не разбирая раздел комментариев
const char *
на строковый литерал было устаревшим до C ++ 11 и в настоящее время является недопустимым. Документация также не дает никаких обещаний не изменять эти данные.