症状
从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选
择,更改文字)在由对话框处理时没有正常工作。
- void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI
- {
- pCmdUI->Enable(FALSE); //没有显示为禁用.
- pCmdUI->SetCheck(TRUE); // 没有文字前显示选定标记.
- pCmdUI->SetRadio(TRUE); // 没有在文字前显示点.
- pCmdUI->SetText("Close"); //没有更改菜单文字.
- }
原因
在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWn
d::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的
话).菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)
更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuP
opup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函
数。
解决
适用下列步骤解决此问题
在消息映射中添加ON_WM_INITMENUPOPUP 项:
- BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
- //{ {AFX_MSG_MAP(CTestDlg)
- ........................
- ........................
- //}}AFX_MSG_MAP
- ON_WM_INITMENUPOPUP()
- END_MESSAGE_MAP()
在你的对话框类中添加OnInitMenuPopup成员函数且复制下列代码到该函数(注意:代码
基本上是从CFrameWnd::OnInitMenuPopup(在WinFrm.cpp中)复制过来的):