如何在菜单项1的OnUpdate处理程序中启用/禁用菜单项2?

时间:2014-09-15 18:48:46

标签: mfc

我有两个菜单项。禁用项目1时,我也希望禁用项目2。在菜单项1的OnUpdate处理程序中,我尝试使用“t_pMenu = pCmdUI-> m_pMenu;”,“t_pMenu = pCmdUI-> m_pSubMenu;”和“t_pMenu = pCmdUI-> m_pParentMenu;”但我总是得到NULL t_pMenu。我怎样才能达到这个目的?

void CDummyView::OnUpdateMenuItem1(CCmdUI* pCmdUI) 
{
    if(m_bShowMenuItem1)
    {
        pCmdUI->SetText("Hide Features")
        CMenu * t_pMenu = pCmdUI->m_pSubMenu;
        if(t_pMenu != NULL)
            t_pMenu->EnableMenuItem(ID_MENU_ITEM2, MF_ENABLED);
    }
    else 
    {
        pCmdUI->SetText("Show Features")
        CMenu * t_pMenu = pCmdUI->m_pParentMenu;
        if(t_pMenu != NULL)
            t_pMenu->EnableMenuItem(ID_MENU_ITEM2, MF_GRAYED);
    }
}

void CDummyView::OnUpdateMenuItem2(CCmdUI* pCmdUI)
{
    ...
}

2 个答案:

答案 0 :(得分:0)

永远不要在一个处理程序中处理不同的命令ID。 如果有按钮和菜单项,则会多次调用每个处理程序。你也不知道序列。当您更改Item1处理程序中的item2时,可以在稍后调用Item2的处理程序时再次启用它。

当你有一个名为m_bShowMenuItem1的标志时,只需使用它。

void CDummyView::OnUpdateMenuItem1(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_bShowMenuItem1);
}

void CDummyView::OnUpdateMenuItem2(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(m_bShowMenuItem1);
}

答案 1 :(得分:0)

我明白了。以下是我试过的代码。两个标志变量m_bShowFeatures和m_bShowSmallFetures初始化为TRUE。

void CDummyView::OnMenuItem1()
{
    m_bShowFeatures = !m_bShowFeatures;
    m_pDoc->UpdateAllViews(NULL, SHOW_HIDE_ALL_FEATURES);
}

void CDummyView::OnUpdateMenuItem1(CCmdUI* pCmdUI) 
{
    if(m_bShowFeatures)
        pCmdUI->SetText("Hide Features")
    else 
        pCmdUI->SetText("Show Features")
}

void CDummyView::OnMenuItem2()
{
    m_bShowSmallFetures= !m_bShowSmallFetures;
    m_pDoc->UpdateAllViews(NULL, SHOW_HIDE_SMALL_FEATURES);
}

void CDummyView::OnUpdateMenuItem2(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(m_bShowFetures)
    if(m_bShowSmallFetures)
        pCmdUI->SetText("Hide Small Features")
    else 
        pCmdUI->SetText("Show Small Features")
}

因此,在单击“菜单项1”时调用OnMenuItem1()后,将调用OnUpdateMenuItem2()。我没想到。