問題背景
這是UE的一個要求,是在CComboBox下拉出ListBox的時候,彈出一個選擇窗口,然後選中一項,顯示在CComboBox的Edit中
同事的做法是在ComboBox的父窗口捕捉ComboBox的CBN_DROPDOWN通知消息,在消息響應函數中彈出選擇窗口,然後為ComboBox設置Strings和選中項。但是不好的現象是,因為是在處理下拉的消息,故此函數結束的時候,下拉ListBox沒有收回。
開始的做法
開始想當然的在通知消息響應函數結束的地方調用
Combobox.SendMessage( CB_SHOWDROPDOWN, (WPARAM)FALSE, 0)
來將下拉框收回,但是失敗,於是又嘗試了
Combobox.SendMessage( WM_KILLFOCUS)和
Combobox.SendMessage( WM_KEYDOWN, VK_ESCAPE, 0)
全部失敗。
有些進步了
經過上面的失敗,寫了一個簡單的對話框程序來測試CComboBox,發現其ListBox不是在CBN_DROPDOWN的通知消息響應函數之中/之前下拉出來的,我們准備下拉ListBox的時候就已經發出了這個通知消息,然後通知消息處理了之後才真正下拉出來。故此我們在通知消息響應函數中做的收回ListBox的函數實際上都被過早的調用了,沒有起作用。
於是在測試程序中,作如下處理
1. 在消息響應函數結束的地方調用
Combobox.PostMessage( WM_KILLFOCUS),注意是PostMessage
2. 在KillFocus的響應函數中調用
Combobox.SendMessage( CB_SHOWDROPDOWN, (WPARAM)FALSE, 0)
測試項目成功通過
但是回到原來的項目中還是不行,發現原來是彈出選擇窗口時就已經發出了KillFocus消息
最終解決方案
很簡單,在CBN_DROPDOWN通知消息的響應函數最後加入
Combobox.PostMessage( WM_KEYDOWN, VK_ESCAPE, 0)