2011-06-17 41 views
8

我有一个带有各种菜单项的菜单,就像您通常那样。每个MenuItem(按钮)都有一个标题,我想在运行时更改该标题。在一个没有问题的正常按钮上,我只是拨打GetDlgItem(ID)->SetWindowText(CString);在运行时更改MenuItem标题

但是我不能在菜单项上这样做,因为我无法将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

菜单不是窗口,它们是菜单。您不能使用GetDlgItem访问菜单。

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

+0

谢谢你的回答。我之前偶然发现了CMenu :: ModifyMenu,但是我没有成功更改标题。请看我编辑的问题!谢谢! – 2011-06-22 11:27:20

4

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

0

您确定拨打GetMenu正在返回有效的CMenu吗?请尝试拨打GetMenu()而不是m_wndToolBar.GetMenu()

您的电话修改菜单似乎是正确的,如果你通过一个MF_BYPOSITION你不需要第三个参数。另请注意,第一个参数(位置)从0开始。

5

您应该首先获取菜单项的命令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);