为什么我不能 disable/gray 出菜单项? (MFC)

Why can't I disable/gray out menuitem? (MFC)

我正在尝试使用 CMenu::EnableMenuItem() 方法 disable/gray 输出菜单项。

我有一个 CMenu* 变量 pMenu,它引用对话框的顶部菜单。我可以使用 pMenu->GetSubMenu(int)submenu->GetMenuStringA() 获取子菜单,验证我返回的 submenus/menu 项的名称。不过,我在使用 EnableMenuItem() 方法时遇到了问题。假设有一个 File 菜单。其中有 NewOpen 弹出菜单以及 ImportCloseClose All 菜单项。 NewOpen 有子菜单项。 (例如 New->Document)使用 submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED); 我可以禁用 NewOpen,但是 ImportClose 和 [=22= 的功能失败],以及带有 NewOpen.

的所有菜单项

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

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

MFC 对 enabling/disabling 菜单项有另一种方案,该方案正在撤消您正在做的事情。要在 MFC 方案中工作,您可以添加消息处理程序 ON_UPDATE_CMD_UI,如下所述:

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

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

当下拉菜单时,框架会搜索并调用各个ON_UPDATE_COMMAND_UIhandler,每个handler都会调用CCmdUI的Enable、Check等成员函数,然后框架会适当的显示每个菜单项。

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