CComboBox OnKillFocus/ShowDropDown nach SetCurSel in Windows 7



  • Wie ihr vielleicht wisst, kann man bei einer CComboBox nur dann vernünftig durch tippen selektieren, wenn die ComboBox automatisch sortiert wird. Falls sie es nicht ist und ich z.B. A und dann B tippe, selektiert sie zuerst den ersten Eintrag der mit A beginnt und dann den ersten der mit B beginnt anstatt den ersten der mit AB beginnt.

    Deswegen habe ich eine abgeleitete Klasse geschrieben (die auch noch ein paar andere Dinge zusätzlich kann) und das Verhalten mit dem selektieren manuell nachprogrammiert. Zum selektieren der Einträge verwende ich SetCurSel und schicke auch CBN_SELCHANGE messages an das Parent Window.

    Auf Windows XP hat das alles wunderbar funktioniert, nun haben wir auf Windows 7 umgestellt. Jetzt habe ich folgendes Problem:
    Wenn ich die ComboBox öffne um die Liste anzeigen zu lasseen ,anschliessend mit tippen einen Eintrag selektiere und mit Tab auf das nächste Control wechsle, so wird danach wieder der Eintrag selektiert, der zu beginn selektiert war.

    Wenn ich OnKillFocus überschreibe und dann folgendes mache:

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

    funktioniert das zwar grundsätzlich, aber für einen Moment wird dennoch der alte Eintrag wieder selektiert, was unschön aussieht.

    Wenn ich CComboBox::OnKillFocus() nicht aufrufe, bleibt die Liste "ausgefahren".

    Daher war mein nächster Versuch das einfach selbst zu machen und in der überschriebenen Variante von OnKillFocus einfach nur ShowDorpDown(FALSE) aufzurufen, sobald ich das mache taucht das Problem wieder auf.
    Daher ist meine Vermutung dass ShowDropDown(FALSE) die Selektion wieder auf einen intern gespeicherten Wert zurücksetzt, der von SetCurSel nicht beeinflusst wird.

    Hat irgendjemand eine Idee, wie ich das Problem lösen kann?


  • Mod

    Dazu müsste man wirklich mehr wissen wie Du alles machst.

    Ansonsten wundert es mich, dass Du überhaupt bei diesem Vorgehen einen Unterschied zwischen Windows 7 und XP hast.


Anmelden zum Antworten