目前位置: VCer资源中心 >>> VCer文章 >>> Windows界面

[本帖已阅读4227次 分值90 回复0次] 张贴资源 发回信箱 控制面板

对话框中使用ON_UPDATE_COMMAND_UI更新菜单

提供者:jerry 张贴时间:2004-06-14 12:50:56.0 出处:http://www.csdn.net 作者:不祥

对话框中使用ON_UPDATE_COMMAND_UI更新菜单(2004-06-14 12:50:56.0)


大头


 
级别: VCer师长
头衔: VCer创始人

经验: 22768
作品: 121
分会: 华中分会
注册: 2003-12-04 10:47:17.0
登录: 2007-06-23 10:17:58.0

症状

从命令用户界面处理函数(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处理并添加下列语句之一到

处理函数。

编译运行此程序。

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2521.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 100% (1 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)