我有一个菜单,其中包含各种菜单项,正如您通常所做的那样。每个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是什么。
答案 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开始。