解决方法:
今天在测试一个单文档项目时通过使用ON_UPDATE_COMMAND_UI消息能够正常更新菜单状态,就用同样的想法应用于对话框项目上,结果却无法正确更新菜单状态,后来查找到了不同的地方发现是WM_INITMENUPOPUP这个消息在对话框项目中没有重载,结果就依葫芦画瓢吧WinFrm.cpp文件中的WM_INITMENUPOPUP消息响应函数实现复制到对话框重载的WM_INITMENUPOPUP消息响应中,再次编写ON_UPDATE_COMMAND_UI对应菜单的更新时,发现竟然可以。
分析一下原因:
在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWnd::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数。菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuPopup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函数。
知道后,就动手试试吧,就会发现不懂原理的时候原来Windows能够如此神奇!