症状
从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选
择,更改文字)在由对话框处理时没有正常工作。
原因
在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWn
d::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的
话).菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)
更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuP
opup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函
数。
解决
适用下列步骤解决此问题
在消息映射中添加ON_WM_INITMENUPOPUP 项:
在你的对话框类中添加OnInitMenuPopup成员函数且复制下列代码到该函数(注意:代码
基本上是从CFrameWnd::OnInitMenuPopup(在WinFrm.cpp中)复制过来的):
状态
设计上行为如此。
更多信息
命令用户界面处理函数也被CWnd::OnCommand 调用以确认命令在传递之前没有被禁用。
这就是禁用的菜单项的命令处理没有被调用的原因(虽然没有以灰色显示(不可用))。
在这种情况下,菜单项没有被重画以反映菜单项的状态.这是Wincore.cpp 文件中的相关
代码:
//在传递命令之前,确定命令没有被禁用
重现此行为的步骤
使用应用程序向导建立一个基于对话框的应用程序
建立一个新的菜单资源,并且向其上添加文件和文件/退出菜单项。
在对话框的属性中设置对话框的菜单为上述菜单.
使用类向导为文件/退出菜单项添加一个UPDATE_COMMAND_UI处理并添加下列语句之一到
处理函数。
编译运行此程序。