在SDI中:禁用菜单的位置,MDI中的代码正常

时间:2017-01-04 21:17:02

标签: c++ menu mfc sdi

我正在尝试禁用主菜单项。 在MDI应用程序中,这有效:

CWnd *pW=AfxGetMainWnd();
CMenu * pMenu=pW->GetMenu();
pMenu->EnableMenuItem(5, MF_BYPOSITION | MF_GRAYED | MF_DISABLED);  

不在SDI中。最有可能的是,我把它放到了错误的地方。 CMainFrame的?风景?哪个特殊子程序?我尝试了构造函数,但UI没有变化。

感谢任何帮助,我正在敲打我的脑袋并搜索了许多网站(和这里),但没有找到正确的方向。

非常感谢

2 个答案:

答案 0 :(得分:1)

您不希望直接启用/禁用MFC下的菜单项,无论是SDI还是MDI。

相反,当您将项目添加到菜单时,会为其添加两个事件处理程序。一个用于“COMMAND”,另一个用于“UPDATE_COMMAND_UI”。

enter image description here

COMMAND处理程序实际执行该菜单项的命令。

UPDATE_COMMAND_UI处理程序(间接)通过返回true / false来启用/禁用菜单项,以指示是否应该启用它。

至于为什么这是优选的:首先,因为你可以(例如)菜单条目和工具栏调用相同的动作。这会自动启用/禁用两者。

答案 1 :(得分:0)

你可以通过使用类向导来添加处理通过UPDATE_COMMAND_UI启用/禁用菜单项的功能来实现这一点:

void CMyAdoMfcView::OnUpdateAddnew(CCmdUI* pCmdUI) 
{
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable(true);
}

在我的代码中,我启用了菜单项AddNew