- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的主框架有一个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/
我需要为 CMFCMenubar 启用可访问性,以便在 this post on MSDN Visual Studio blog 中提到的编码 ui 测试(默认不支持)中使用它不完全支持 MFC 功能
在使用 VS2008 的文档/ View 项目中,一个 MFCMenuBar似乎从项目中加载了正确的 MENU 资源 (IDR_MAINFRAME),因为添加和删除菜单项反射(reflect)在菜单的
有没有办法在 MFC 应用程序的菜单栏中创建动态菜单项,该应用程序使用 visual studio 2008 风格创建,菜单不是功能区,我有动态添加菜单的插件,如何将它们添加到该菜单???我明白了 /
我想让 MFC 中的工具栏 (CMFCToolBar) 显示透明,就像 CMFCMenuBar 的默认外观一样。 我正在使用控件样式 TBSTYLE_FLAT | TBSTYLE_TRANSPAREN
我的主框架有一个CMFCMenuBar成员,里面包含了当前文档类型的菜单。我想动态添加/删除子菜单。例如,如果用户选择显示 map Pane ,我想在"file"菜单旁边添加一个 map 子菜单。 反
我是一名优秀的程序员,十分优秀!