为什么我不能禁用/灰显menuitem?(MFC)

Amr*_*mre 7 c++ mfc cmenu

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

我有一个引用对话框顶部菜单的CMenu*变量pMenu.我可以使用pMenu->GetSubMenu(int)和使用子菜单submenu->GetMenuStringA(),验证我得到的子菜单/菜单项的名称.我遇到了这个EnableMenuItem()方法的麻烦.让我们说这是一个File菜单.在它有NewOpen弹出菜单和Import,CloseClose All菜单项.在NewOpen有子菜单项.(例如New->Document)使用submenu->EnableMenuItem([position of submenu/menuitem], MF_BYPOSITION | MF_GRAYED);我可以禁用NewOpen,但功能失败Import,Close以及Close All,以及所有菜单项NewOpen.

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

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

Sco*_*MVP 7

MFC has another scheme for enabling/disabling menu items and that scheme is undoing what you are doing. To work within the MFC scheme you add message handlers ON_UPDATE_CMD_UI as described here:

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


Ser*_*sta 3

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

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

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

  • 你绝对做不到这一点!相反,您应该向 MFC 应用程序发送自定义消息,告诉它某些菜单项应该变灰。然后在 MFC 应用程序中,您将能够使用 ON_UPDATE_COMMAND_UI 处理程序来启用/禁用它们。我无法想象 MFC 应用程序的另一种方式。 (2认同)