2010-03-26 97 views
0

正如你可能知道一個CComboBox(DropDownList樣式)只能通過鍵入正確選擇,如果你不讓它autosort它的內容。這裏是我的意思的一個例子: 您鍵入A然後B鍵。如果它不是自動排序,它將首先選擇以A開頭的下一個條目,然後選擇以B開頭的下一個條目。如果排序它將選擇下一個用A輸入,然後用AB輸入下一個。MFC CComboBox OnKillFocus/ShowDropDown Windows 7上的SetCurSel後

我有一個繼承自CComboBox的類,它的內容沒有按內置的排序機制排序。我想要一個正確的按鍵輸入行爲,所以我自己實現了。我使用SetCurSel選擇條目,然後將CBN_SELCHANGE消息發送到父窗口。

在Windows XP上,這工作得很好。我們現在正在使用Windows 7,並且現在出現以下問題: 如果我使用鼠標打開下拉列表,請通過鍵入它來選擇一個條目,然後使用Tab跳轉到下一個控件,即開始時選擇的值會自動重新選擇。

如果我覆蓋OnKillFocus並執行以下操作:

int index = GetCurSel(); 
CComboBox::OnKillFocus(); 
SetCurSel(index); 

一般工作,但一會兒老選定值仍然會閃爍發光,這是醜陋的。

如果我不調用CComboBox :: OnKillFocus()正確的條目保持選中,但組合框仍然下降。

所以我的下一個嘗試是手動調用SetDropDown(FALSE)(並沒有任何其他的OnKillFocus()),但隨後問題再次出現。

所以我的猜測是,如果你打開下拉列表,當前選擇內部存儲。調用SetCurSel不會更新此內部值。如果你標出內部值再次被重新選擇。

任何想法如何我可以解決這個問題?

回答

0

只有未經證實的觀點:

  • 覆蓋CB_SHOWDROPDOWN處理。如果下拉列表已關閉,則可能調用SetCurSel 來存儲項目。

  • 覆蓋CB_SETCURSEL處理,添加指示是否處理CB_SETCURSEL消息的標誌。在代碼示例中調用CComboBox :: OnKillFocus()時關閉標誌。