如何使用MFC禁用和灰显顶级菜单项

时间:2009-12-02 19:22:34

标签: c++ mfc popup menuitem

我有一个对话框应用程序,我希望在对话框的顶部有可点击的菜单项。这些项目不显示下拉菜单,但实际运行相关命令。

我是通过在对话框属性中设置Popup = False并指定message-id来完成此操作的,但是当项目无法点击时我的问题无法正确禁用项目(取决于内部状态)存储在对话框中)

我已经找到了如何禁用http://www.microsoft.com/msj/0299/c/c0299.aspx的任何弹出式父菜单项,但这不是我想要的

我还了解了如何从msdn知识库文章KB242577中将菜单命令路由添加到对话框中。

这适用于子菜单项,但不适用于顶级菜单。

我目前正在使用以下功能来执行禁用

void CYourDlg::EnableMenuItem(UINT nCommand, BOOL bEnable)
{
   CMenu* pMenu = GetMenu();
   pMenu->EnableMenuItem(nCommand, bEnable ? 0 : MF_DISABLED | MF_GRAYED);
}

这一半有效,如果你远离应用程序的alt-tab它显示为禁用,否则它不会。

有没有办法以编程方式使区域无效?

我认为可能涉及非客户区域消息。

2 个答案:

答案 0 :(得分:5)

我没有尝试,但在常规窗口(不是对话框)CWnd::DrawMenuBar应该做你想要的。它也可以与基于对话框的应用程序一起使用。

void CYourDlg::EnableMenuItem(UINT nCommand, BOOL bEnable)
{
   CMenu* pMenu = GetMenu();
   pMenu->EnableMenuItem(nCommand, bEnable ? 0 : MF_DISABLED | MF_GRAYED);
   DrawMenuBar();
}

答案 1 :(得分:1)

我认为你应该为你的菜单ID添加一个ON_UPDATE处理程序。这样可以确保在需要时启用/禁用菜单。