写了一个类似记事本的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;
}
代码:
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;
}
{
// 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 的值
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;
}