程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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