Изменить заголовок MenuItem во время выполнения

У меня есть меню со всеми видами пунктов меню, как обычно. Каждый элемент меню (кнопка) имеет заголовок, и я хотел бы изменить этот заголовок во время выполнения. На обычной кнопке, которая на самом деле не проблема, я просто вызываю GetDlgItem(ID)->SetWindowText(CString);

Однако я не могу сделать это в пунктах меню, так как не могу назначить идентификатор ни одному из них. Поле идентификатора в редакторе свойств на самом деле говорит: «ID не может быть отредактирован».

Итак, как мне изменить текст пунктов меню во время выполнения?

EDIT: я пытался использовать CMenu::ModifyMenu, однако безуспешно. Я не знаю, как указать кнопку (элемент) для изменения. Также у меня есть сомнения в правильности того, как я передаю CString в качестве аргумента.

Это моя (неудачная) попытка:

CString str = "Foo";
CMenu * pMenu = m_wndToolBar.GetMenu();
pMenu->ModifyMenu(1, MF_BYPOSITION | MF_STRING, 0 /*Don't know what to pass as nIDNewItem */, str);

Это (вызов метода ModifyMenu) вызывает ошибку утверждения отладки. Обратите внимание, что я не знаю, что такое nIDNewItem.


person David Božjak    schedule 17.06.2011    source источник


Ответы (4)


Сначала вы должны получить идентификатор команды пункта меню. Попробуй это:

tr = L"Foo";
CMenu * pMenu = m_wndToolBar.GetMenu();
MENUITEMINFO info;
info.cbSize = sizeof(MENUITEMINFO);
info.fMask = MIIM_ID;
VERIFY(pMenu->GetMenuItemInfo(1, &info, TRUE));
pMenu->ModifyMenuW(info.wID, MF_BYCOMMAND | MF_STRING, info.wID, tr);
person fred.yu    schedule 22.02.2013

Вы можете попробовать добавить обработчик ON_UPDATE_COMMAND_UI для пункта меню и вызвать в нем pCmdUI->SetText().

person john_e    schedule 15.07.2011

Меню - это не окна, это меню. Вы не можете использовать GetDlgItem для доступа к меню.

В MFC класс CMenu можно использовать для создания и/или управления меню. CMenu::ModifyMenu может быть тем, что вы ищут.

person Ajay    schedule 21.06.2011
comment
Спасибо за ваш ответ. Я наткнулся на CMenu::ModifyMenu раньше, однако мне не удалось изменить заголовок. Пожалуйста, смотрите мой отредактированный вопрос! Спасибо! - person David Božjak; 22.06.2011

Вы уверены, что вызов GetMenu возвращает действительное CMenu? Попробуйте позвонить только GetMenu() вместо m_wndToolBar.GetMenu().

Ваш вызов ModifyMenu кажется правильным, если вы передаете MF_BYPOSITION, вам не нужен третий параметр. Также обратите внимание, что 1-й параметр (позиция) начинается с 0.

person Fábio    schedule 26.07.2011