gpt4 book ai didi

c++ - 是否可以操纵我的 CMDIFrameWndEx 的 CMFCMenuBar 的菜单?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:51 24 4
gpt4 key购买 nike

我的主框架有一个CMFCMenuBar成员,里面包含了当前文档类型的菜单。我想动态添加/删除子菜单。例如,如果用户选择显示 map Pane ,我想在"file"菜单旁边添加一个 map 子菜单。

反之亦然,如果 map Pane 关闭,我也想删除 map 菜单项。

有一个可行但我不喜欢的方法是简单地禁用 ON_UPDATE_COMMAND_UI 处理程序中的菜单项。
Frame 有一个名为 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();

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

这是不可能的还是我做错了什么?

除了添加/删除子菜单之外,还有什么好的替代方法吗?

最佳答案

一种方法是处理 WM_INITMENUPOPUP 消息。就在显​​示菜单之前,OnInitMenuPopup 将被调用并带有指向菜单的指针。

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

使用它的诀窍是弄清楚如何识别已调用的菜单。一种方法是比较已知项目的菜单项 ID。例如,如果菜单上的第一项是 ID_FILE_OPEN,您可以查找它。如果找到,您会假设打开的是"file"菜单,您可以添加自定义子菜单。

也许你也可以使用 MENUINFO 结构的 dwMenuData 成员,尽管我似乎记得由于 CMFCMenuBar 构建菜单。

关于c++ - 是否可以操纵我的 CMDIFrameWndEx 的 CMFCMenuBar 的菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3908655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com