5

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

我通过在对话框属性中设置 Popup=False 并分配消息 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 键,它确实显示为已禁用,否则不会。

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

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

4

2 回答 2

6

我没有尝试过,但在常规窗口(不是对话框)中,CWnd::DrawMenuBar应该做你想做的事。它也可能适用于基于对话框的应用程序。

void CYourDlg::EnableMenuItem(UINT nCommand, BOOL bEnable)
{
   CMenu* pMenu = GetMenu();
   pMenu->EnableMenuItem(nCommand, bEnable ? 0 : MF_DISABLED | MF_GRAYED);
   DrawMenuBar();
}
于 2009-12-03T02:33:39.250 回答
1

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

于 2009-12-03T11:12:29.247 回答