【问题标题】:Change MenuItem caption at runtime在运行时更改 MenuItem 标题
【发布时间】:2011-09-17 00:50:10
【问题描述】:

我有一个包含各种菜单项的菜单,就像您通常那样。每个 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 是什么。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 感谢您的回答。我之前偶然发现了 CMenu::ModifyMenu,但是我没有成功更改标题。请查看我编辑的问题!谢谢!
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多