在运行时更改MenuItem标题

时间:2011-06-17 09:03:18

标签: user-interface mfc menu menuitem visual-studio-2003

我有一个菜单,其中包含各种菜单项,正如您通常所做的那样。每个MenuItem(按钮)都有一个标题,我想在运行时更改该标题。在一个不是真正问题的普通按钮上,我只需拨打GetDlgItem(ID)->SetWindowText(CString);

但是我无法在菜单项上执行此操作,因为我无法将ID分配给其中任何一个。 “属性”编辑器中的ID字段实际上显示“无法编辑ID”。

那么如何在运行时更改菜单项文本?

编辑:我尝试过使用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 个答案:

答案 0 :(得分:6)

您应首先获取菜单项的命令ID。试试这个:

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);

答案 1 :(得分:5)

您可以尝试为菜单选项添加ON_UPDATE_COMMAND_UI处理程序,并在其中调用pCmdUI->SetText()

答案 2 :(得分:0)

菜单不是窗户,它们是菜单。您无法使用GetDlgItem访问菜单。

在MFC中,CMenu类可用于创建和/或控制菜单。 CMenu::ModifyMenu可能是您正在寻找的东西。

答案 3 :(得分:0)

您确定对 GetMenu 的调用是否返回了有效的CMenu?请尝试仅调用 GetMenu(),而不是 m_wndToolBar.GetMenu()

您对 ModifyMenu 的调用似乎是正确的,如果您通过MF_BYPOSITION,则不需要第3个参数。另请注意,第一个参数(位置)从0开始。

相关问题