我有一个对话框应用程序,我希望在对话框的顶部有可点击的菜单项。这些项目不显示下拉菜单,但实际运行相关命令。
我是通过在对话框属性中设置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它显示为禁用,否则它不会。
有没有办法以编程方式使区域无效?
我认为可能涉及非客户区域消息。
答案 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处理程序。这样可以确保在需要时启用/禁用菜单。