4

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

反之亦然,如果地图窗格关闭,我还想删除地图菜单项。

一件有效但我不喜欢的事情是简单地禁用ON_UPDATE_COMMAND_UI处理程序中的菜单项。
Frame 有一个调用方法,GetMenuBar()但该方法返回给我 aconst CMFCMenuBar *所以我不能从外部修改它。我添加了一个吸气剂,所以我得到了对菜单栏的非常量引用,但这也不起作用:

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示例的改编。不过,我有一种感觉,这个示例被破坏了,因为我无法确定是否或何时执行该特定代码。在示例中,代码仅在菜单栏被重置或尚未将状态保存到注册表时执行。

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

添加/删除子菜单是否有一个不错的选择?

4

1 回答 1

4

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

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

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

可能您也可以使用该结构的dwMenuData成员MENUINFO,尽管我似乎记得由于CMFCMenuBar构建菜单的方式而遇到了问题。

于 2010-10-11T22:32:14.323 回答