Как изменить текст пункта меню?

0

Мне нужно изменить текст пункта меню во время выполнения. Я пытаюсь использовать 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;

Но это не работает, текст не изменился. Что я делаю неправильно? Как его реализовать?

  • 0
    Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибках, используйте функцию GetLastError. - Проверьте на ошибки. Также обратите внимание, что указание const char * на строковый литерал было устаревшим до C ++ 11 и в настоящее время является недопустимым. Документация также не дает никаких обещаний не изменять эти данные.
  • 0
    Спасибо за комментарий. Но SetMenuItemInfoA () возвращает 1. Как я вижу, это означает, что функция завершается успешно. О наведении символа: как правильно его установить?
Показать ещё 8 комментариев
Теги:
visual-c++
winapi

1 ответ

0

Как отметил @HansPassant, решение:

Вы не используете MENUITEMDATA правильно, вы забыли установить член fMask. Прочтите статью MSDN для структуры для подробностей

а потом:

добавить menuitem.fMask = MIIM_TYPE | MIIM_DATA; menuitem.fMask = MIIM_TYPE | MIIM_DATA; и он хорошо работает

Я не могу взять кредит на это решение, но предоставляю его здесь, чтобы следующий человек, которому нужен ответ на этот вопрос, мог легко найти его, не разбирая раздел комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню