为什么我不能 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
菜单。其中有 New
和 Open
弹出菜单以及 Import
、Close
和 Close All
菜单项。 New
和 Open
有子菜单项。 (例如 New->Document
)使用 submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED);
我可以禁用 New
或 Open
,但是 Import
、Close
和 [=22= 的功能失败],以及带有 New
和 Open
.
的所有菜单项
注意:当我说 EnableMenuItem()
失败时,我并不是说 returns -1。它 returns 以前的状态,但菜单不会被禁用或变灰。
在 EnableMenuItem()
的 MSDN 文档中:http://msdn.microsoft.com/en-us/library/h62wh3y1.aspx 它声称这将适用于弹出菜单项和标准菜单项。不过,它似乎只适用于弹出式广告。
MFC 对 enabling/disabling 菜单项有另一种方案,该方案正在撤消您正在做的事情。要在 MFC 方案中工作,您可以添加消息处理程序 ON_UPDATE_CMD_UI,如下所述:
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 的属性。
我正在尝试使用 CMenu::EnableMenuItem()
方法 disable/gray 输出菜单项。
我有一个 CMenu*
变量 pMenu
,它引用对话框的顶部菜单。我可以使用 pMenu->GetSubMenu(int)
和 submenu->GetMenuStringA()
获取子菜单,验证我返回的 submenus/menu 项的名称。不过,我在使用 EnableMenuItem()
方法时遇到了问题。假设有一个 File
菜单。其中有 New
和 Open
弹出菜单以及 Import
、Close
和 Close All
菜单项。 New
和 Open
有子菜单项。 (例如 New->Document
)使用 submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED);
我可以禁用 New
或 Open
,但是 Import
、Close
和 [=22= 的功能失败],以及带有 New
和 Open
.
注意:当我说 EnableMenuItem()
失败时,我并不是说 returns -1。它 returns 以前的状态,但菜单不会被禁用或变灰。
在 EnableMenuItem()
的 MSDN 文档中:http://msdn.microsoft.com/en-us/library/h62wh3y1.aspx 它声称这将适用于弹出菜单项和标准菜单项。不过,它似乎只适用于弹出式广告。
MFC 对 enabling/disabling 菜单项有另一种方案,该方案正在撤消您正在做的事情。要在 MFC 方案中工作,您可以添加消息处理程序 ON_UPDATE_CMD_UI,如下所述:
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 的属性。