8

我正在尝试使用该CMenu::EnableMenuItem()方法禁用/灰显菜单项。

我有一个引用对话框顶部菜单的CMenu*变量。pMenu我可以使用pMenu->GetSubMenu(int)和 using获取子菜单submenu->GetMenuStringA(),验证我返回的子菜单/菜单项的名称。不过,我在使用该EnableMenuItem()方法时遇到了麻烦。假设有一个File菜单。其中有NewOpen弹出菜单和ImportCloseClose All菜单项。和NewOpen子菜单项。(例如New->Document)使用submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED);I 可以禁用Newor ,但是对于,和以及所有带有and的菜单项,Open该功能都会失败。ImportCloseClose AllNewOpen

注意:当我说EnableMenuItem()失败时,我并不是说它返回-1。它返回以前的状态,但菜单不会被禁用或变灰。

在 MSDN 文档中:http EnableMenuItem(): //msdn.microsoft.com/en-us/library/h62wh3y1.aspx它声称这适用于弹出菜单项和标准菜单项。不过,它似乎只适用于弹出窗口。

4

2 回答 2

7

MFC 有另一个用于启用/禁用菜单项的方案,该方案正在撤消您正在执行的操作。要在 MFC 方案中工作,请添加消息处理程序 ON_UPDATE_CMD_UI,如下所述:

http://msdn.microsoft.com/en-us/library/6kc4d8fh.aspx

于 2015-01-19T14:32:44.953 回答
3

ScottMcP-MVP MFC 在 ON_UPDATE_COMMAND_UI 处理程序中进行了菜单配置:当您的应用程序的用户下拉菜单时,每个菜单项都需要知道它应该显示为启用还是禁用。菜单命令的目标通过实现 ON_UPDATE_COMMAND_UI 处理程序来提供此信息。对于应用程序中的每个命令用户界面对象,使用“属性”窗口为每个处理程序创建消息映射条目和函数原型。

当下拉菜单时,框架会搜索并调用每个 ON_UPDATE_COMMAND_UI 处理程序,每个处理程序调用诸如 Enable 和 Check 等 CCmdUI 成员函数,然后框架会适当地显示每个菜单项。

这意味着您必须在自己的类中存储可以选中/取消选中的菜单项的预期状态。您必须在ON_UPDATE_COMMAND_UI宏附近为每个菜单元素放置一个宏ON_COMMAND,并且该元素将引用一个接收 CCmdUi 对象的函数,您可以根据需要对其进行修改。但是当您使用 MFC 时,您通常不会手动执行此操作,而只是使用包含菜单的窗口的属性。

于 2015-01-19T15:07:39.243 回答