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中)。看到這,額,彷佛我想解決的問題,是無解的。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

相關文章
相關標籤/搜索