CDialogBar上的按钮自动Disable

本文介绍了一个关于MFC框架下CDialogBar按钮失效的问题及其解决方法。通过深入研究发现,需在CDialogBar的派生类中重载OnUpdateCmdUI函数来更新按钮状态,以此解决按钮无法点击的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

刚开始在MainFrame中使用默认的CDialogBar没有任何问题,DialogBar上的按钮响应一切正常。后来由于MainFrame越来越庞大,就想把DialogBar相关的消息响应从MainFrame中移出来,放到单独的CDialogBar继承类的文件中。当这么操作时,诡异的问题就随之而来,DialogBar上的按钮都Disable(直接灰度化,无法点击)了。本来不想多了解MFC的机制的,毕竟感觉UI方面MFC太落后了,不是未来的趋势。无奈工作需要,还是得解决这个问题,得深入了解CDialogBar的相关资料。

资料搜索

网上有一篇文章叫INFO:CDialogBar Button Enabled When Command Handler Present(微软官方文档)。大致的意思是说如果DialogBar上的按钮没有添加消息响应,则按钮会自动地被Disable掉。还有提到,由于CDialogBar对象不在消息路由机制当中,因此像ON_BN_CLICKED()ON_COMMAND()这样的消息响应必须添加在CDialogBar的父窗口中(我这种情况下,就是指MainFrame中)。看到这,额,似乎我想解决的问题,是无解的。

问题解决

后来又在MSDN中查找CDialogBar的相关信息,查找到:

Dialog bar buttons should be updated through the ON_UPDATE_COMMAND_UI handler mechanism. At idle time, the dialog bar will call the ON_UPDATE_COMMAND_UI handler with the command ID of all the buttons that have a ID >= 0x8000 (that is, in the range of command IDs).

抱着试试看的心态,在CDialogBar的继承类中添加重载函数OnUpdateCmdUI,在重载函数中调用相关按钮的EnableWindow(TURE),编译运行,OK!居然好了,按钮正常显示。然后尝试着把按钮的EnableWindow(TRUE)调用删除,按钮也能正常显示,点击消息响应也OK。看来是OnUpdateCmdUI在整个消息路由机制中起作用了。至于具体原因也就不去深究了,反正自己的需求也已经达到了。

转载于:https://my.oschina.net/chen0dgax/blog/187368

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值