Изменить заголовок MenuItem во время выполнения - PullRequest
8 голосов
/ 17 июня 2011

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

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

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

РЕДАКТИРОВАТЬ : Я пытался использовать 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.

Ответы [ 4 ]

6 голосов
/ 22 февраля 2013

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

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);
5 голосов
/ 16 июля 2011

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

0 голосов
/ 26 июля 2011

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

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

0 голосов
/ 21 июня 2011

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

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

...