最近无聊在写一个播放器,当实习右键菜单的时候遇到了一个问题,点击菜单无法接收ON_UPDATE_COMMAND_UI消息,后来经过一番学习后才明白其中的原因,以下就是解决的方法。
症状
从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选择,更改文字)在由对话框处理时没有正常工作。
void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI
{
pCmdUI->Enable(FALSE); //没有显示为禁用.
pCmdUI->SetCheck(TRUE); // 没有文字前显示选定标记.
pCmdUI->SetRadio(TRUE); // 没有在文字前显示点.
pCmdUI->SetText("Close"); //没有更改菜单文字.
}
原因
在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWnd::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的话).菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)
更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuPopup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函数。
解决
适用下列步骤解决此问题
在消息映射中添加ON_WM_INITMENUPOPUP 项:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{
{AFX_MSG_MAP(CTestDlg)
........................