CDialogBar上的按钮自动Disable

问题描述

刚开始在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在整个消息路由机制中起作用了。至于具体原因也就不去深究了,反正自己的需求也已经达到了。

你可能感兴趣的:(mfc,CDialogBar)