代码之家  ›  专栏  ›  技术社区  ›  foraidt

有可能操纵菜单的菜单吗?

  •  4
  • foraidt  · 技术社区  · 14 年前

    我的主框架有一个CMFCMenuBar成员,其中包含当前文档类型的菜单。 我想动态添加/删除子菜单。 例如,如果用户选择显示地图窗格,我想在“文件”菜单旁边添加一个地图子菜单。

    有一件事是可行的,但我不喜欢的是简单地禁用菜单中的菜单项 ON_UPDATE_COMMAND_UI 处理程序。
    框架有一个名为 GetMenuBar() 但那个给了我一个 const CMFCMenuBar * 所以我不能从外面修改它。我添加了一个getter,因此得到了对菜单栏的非常量引用,但这也不起作用:

    CMenu menu;
    VERIFY(menu.LoadMenu(IDR_MAP));
    CMFCMenuBar & menuBar = pFrm->GetNonConstMenuBar(); // Custom getter
    menuBar.InsertButton(CMFCToolBarMenuButton(0, menu, -1));
    menuBar.AdjustLayout();
    menuBar.AdjustSizeImmediate();
    

    以上代码是 void CMyMenuBar::AddSubMenu () DynamicMenu 样品。 不过,我有一种感觉,这个示例被破坏了,因为我无法确定是否或何时执行了特定的代码。 在该示例中,仅当菜单栏正在重置或尚未将状态保存到注册表时才执行代码。

    除了添加/删除子菜单,还有什么好的选择吗?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Nate    14 年前

    WM_INITMENUPOPUP 信息。在菜单显示之前, OnInitMenuPopup 将用指向菜单的指针调用。

    请注意,每次弹出菜单时都会调用它,您所做的任何更改都会在调用之间丢失(每次都必须添加菜单项) OnInitMenuPopup公司 称为)。

    使用它的诀窍是找出如何识别已调用的菜单。一种方法是比较已知项的菜单项ID。例如,如果菜单上的第一项是ID\u FILE\u OPEN,则可以查找该项。如果找到了,您将假设您的文件菜单是正在打开的,并且您可以添加您的自定义子菜单。

    dwMenuData 委员会成员 MENUINFO struct,虽然我似乎记得由于 CMFCMenuBar 构建菜单。

    推荐文章