刚开始在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中)。看到这,额,彷佛我想解决的问题,是无解的。code
后来又在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
在整个消息路由机制中起做用了。至于具体缘由也就不去深究了,反正本身的需求也已经达到了。ci