C++ 禁用主菜单

C++ 禁用主菜单,c++,visual-c++,menu,mfc,mdi,C++,Visual C++,Menu,Mfc,Mdi,我有一份菜单,看起来有点像 当我打开一个特定的对话框时,我想禁用整个菜单。我意识到我可以通过使用Update_命令_ui单独禁用每个菜单项,但这意味着为100个或更多菜单项添加事件处理程序。菜单最初是用CMultiDocTemplate加载的。有没有办法通过使用ID资源(IDR_菜单)来实现这一点? 任何帮助都将不胜感激。 谢谢。在大型机类中,m_wndMenuBar.EnableWindow(FALSE)?主菜单项不会灰显,但它们是不可选择的。在大型机类中,m_wndMenuBar.Enab

我有一份菜单,看起来有点像

当我打开一个特定的对话框时,我想禁用整个菜单。我意识到我可以通过使用Update_命令_ui单独禁用每个菜单项,但这意味着为100个或更多菜单项添加事件处理程序。菜单最初是用CMultiDocTemplate加载的。有没有办法通过使用ID资源(IDR_菜单)来实现这一点? 任何帮助都将不胜感激。
谢谢。

在大型机类中,
m_wndMenuBar.EnableWindow(FALSE)?主菜单项不会灰显,但它们是不可选择的。

在大型机类中,
m_wndMenuBar.EnableWindow(FALSE)?主菜单项不会灰显,但它们不可选择。

我使用

CMenu* pMenu = AfxGetMainWnd()->GetMenu();
if(pMenu != NULL)
{
    for(UINT i = 0; i < pMenu->GetMenuItemCount (); ++i)
        pMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED);
}
CMenu*pMenu=AfxGetMainWnd()->GetMenu();
如果(pMenu!=NULL)
{
对于(UINT i=0;iGetMenuItemCount();+i)
pMenu->EnableMenuItem(i,MF_BYPOSITION | MF_DISABLED);
}
如中所述。它对我有用。

我曾经

CMenu* pMenu = AfxGetMainWnd()->GetMenu();
if(pMenu != NULL)
{
    for(UINT i = 0; i < pMenu->GetMenuItemCount (); ++i)
        pMenu->EnableMenuItem(i, MF_BYPOSITION | MF_DISABLED);
}
CMenu*pMenu=AfxGetMainWnd()->GetMenu();
如果(pMenu!=NULL)
{
对于(UINT i=0;iGetMenuItemCount();+i)
pMenu->EnableMenuItem(i,MF_BYPOSITION | MF_DISABLED);
}

如中所述。这对我很有效。

似乎与此问题类似,对话框已经是模态的。所以你无法进入菜单。很难猜出你为什么问这个问题。@HansPassant:当然,除非它们是非模态的。我不确定这里是否是这样,如果是这样,是否是故意的。是的,对话框是无模式的,我需要访问应用程序中的OpenGL视图,因此我将其设置为无模式。但是,由于对话框依赖于菜单中的其他许多对话框,因此菜单必须不可访问。
EnableMenuItem
的签名表明,只能禁用具有命令ID(而不是弹出窗口)的菜单项。但是,
SetMenuItemInfo
可能会为您提供一种解决方法,因为您可以根据位置和ID引用项目。与此问题类似,对话框已经是模态的。所以你无法进入菜单。很难猜出你为什么问这个问题。@HansPassant:当然,除非它们是非模态的。我不确定这里是否是这样,如果是这样,是否是故意的。是的,对话框是无模式的,我需要访问应用程序中的OpenGL视图,因此我将其设置为无模式。但是,由于对话框依赖于菜单中的其他许多对话框,因此菜单必须不可访问。
EnableMenuItem
的签名表明,只能禁用具有命令ID(而不是弹出窗口)的菜单项。但是,
SetMenuItemInfo
可能会为您提供一种解决方法,因为您可以按位置和ID引用项目。