对话框中使用ON_UPDATE_COMMAND_UI更新菜单

本文详细介绍了在MFC应用程序中如何利用ON_UPDATE_COMMAND_UI消息响应来动态更新对话框中的菜单项状态,确保用户界面的实时反馈。
摘要由CSDN通过智能技术生成
 

症状

从命令用户界面处理函数(Command UI handler)改变菜单状态(启用/禁用,选择/取消选

择,更改文字)在由对话框处理时没有正常工作。

 
  1. void CTestDlg::OnUpdateFileExit(CCmdUI* pCmdUI    
  2. {    
  3.     pCmdUI->Enable(FALSE); //没有显示为禁用.    
  4.     pCmdUI->SetCheck(TRUE); // 没有文字前显示选定标记.    
  5.     pCmdUI->SetRadio(TRUE); // 没有在文字前显示点.    
  6.     pCmdUI->SetText("Close"); //没有更改菜单文字.    
  7. }   

原因

在下拉菜单显示的时候, WM_INITMENUPOPUP消息被先发送以显示菜单项。MFC CFrameWn

d::OnInitMenuPopup 函数遍历菜单项并为每个菜单项调用更新命令处理函数(如果有的

话).菜单的外观被更新以反映它的状态(启用/禁用,选择/取消选择)

更新用户界面机制在基于对话框的应用程序中不能工作,因为CDialog没有OnInitMenuP

opup 处理函数,而使用CWnd's 默认处理函数,该函数没有为菜单项调用更新命令处理函

数。

解决

适用下列步骤解决此问题

在消息映射中添加ON_WM_INITMENUPOPUP 项:

 
  1. BEGIN_MESSAGE_MAP(CTestDlg, CDialog)    
  2.  //{ {AFX_MSG_MAP(CTestDlg)    
  3.                         ........................    
  4.                         ........................    
  5.  //}}AFX_MSG_MAP    
  6.  ON_WM_INITMENUPOPUP()    
  7. END_MESSAGE_MAP()   

在你的对话框类中添加OnInitMenuPopup成员函数且复制下列代码到该函数(注意:代码

基本上是从CFrameWnd::OnInitMenuPopup(在WinFrm.cpp中)复制过来的):

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值