程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 控制CComboBox中ListBox的DropDown及Back

控制CComboBox中ListBox的DropDown及Back

編輯:關於VC++

問題背景

這是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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved