写了一个类似记事本的MFC程序,只是简单地从CFrameWnd派生了框架类,然后添加菜单。用ON_UPDATE_COMMAND_UI处理菜单弹出响应时发现该失效的菜单项没有失效,调试时发现CCmdUI的其他函数都没有起作用,另外只有点击菜单时才执行OnInitMenuPopup关联的处理函数。不知哪位大哥可以帮下,不胜感激!
代码:
ON_UPDATE_COMMAND_UI(IDC_EDIT_CUT,  OnUpdateEditCut)
.
.
.
void CMainWindow::OnUpdateEditCut(CCmdUI*pCmdUI)
{
   pCmdUI->Enable(IsTextSelected());
}BOOL CMainWindow::IsTextSelected()
{
int nStart,nEnd;
m_wndEdit.GetSel(nStart,nEnd);
return nStart!=nEnd;
}

解决方案 »

  1.   

    CMainFrame::CMainFrame()
    {
       // Set to FALSE so no ON_UPDATE_COMMAND_UI or
       // ON_COMMAND handlers are needed, and
       // CMenu::EnableMenuItem() will work as expected.
       m_bAutoMenuEnable  = FALSE;
    }When this data member is enabled (which is the default), menu items that do not have ON_UPDATE_COMMAND_UI or ON_COMMAND handlers will be automatically disabled when the user pulls down a menu. Menu items that have an ON_COMMAND handler but no ON_UPDATE_COMMAND_UI handler will be automatically enabled. When this data member is set, menu items are automatically enabled in the same way that toolbar buttons are enabled.This data member simplifies the implementation of optional commands based on the current selection and reduces the need for an application to write ON_UPDATE_COMMAND_UI handlers for enabling and disabling menu items.
    去改变一下m_bAutoMenuEnable  的值
      

  2.   

    IDC_EDIT_CUT已经写了响应函数了吗?
      

  3.   

    已经实现了所有菜单项的响应函数了,CManu的相关函数是可以用的,但是CCmdUI却就是不起作用,也按照二楼那位建议的那样做了,可结果也是一样。还有很不明白的是,用Appward生成,在childview里却是可以的,更新函数在弹出前被执行了。这是为什么呢?
      

  4.   

    你的意图和问题没有表述清楚:pCmdUI->Enable(IsTextSelected());//这里不是用IsTextSelected()自己看下面链接:http://school.cnd8.com/vc/jiaocheng/38969_3.htm
      

  5.   

    那我重申下喔我的问题吧。
    1、我自己手写了一个简单记事本。对菜单使用ON_UPDATE_COMMAND_UI,以实现在菜单弹出前的进行预处理。运行和调试时,发现菜单弹出前没有调用ON_UPDATE_COMMAND_UI处理函数。弹出菜单后,点击菜单项时,ON_UPDATE_COMMAND_UI处理函数被调用了。
    2、用Appward生成类似的程序时,ON_UPDATE_COMMAND_UI处理函数正常工作
    代码:
    ON_UPDATE_COMMAND_UI(IDC_EDIT_CUT,  OnUpdateEditCut)
    .
    .
    .
    void CMainWindow::OnUpdateEditCut(CCmdUI*pCmdUI)
    {
      pCmdUI->Enable(IsTextSelected());
    }BOOL CMainWindow::IsTextSelected()
    {
    int nStart,nEnd;
    m_wndEdit.GetSel(nStart,nEnd);
    return nStart!=nEnd;
    }
      

  6.   

    我遇到了与你一样的问题。NND。 2~3年没用VS了,怎么成这样子了。