Comme vous le savez peut-être, un CComboBox (style DropDownList) ne se sélectionne correctement qu'en tapant si vous ne le laissez pas autosortir son contenu. Voici un exemple de ce que je veux dire: Vous tapez A puis B. Si ce n'est pas sur autosort, il va d'abord sélectionner l'entrée suivante commençant par A, puis l'entrée suivante commençant par B. Si elle est triée, elle sélectionnera la suivante entrée avec A, puis le prochain début avec AB.MFC CComboBox OnKillFocus/ShowDropDown après SetCurSel sous Windows 7
J'ai une classe qui hérite de CComboBox et son contenu n'est pas trié par le mécanisme de tri intégré. Je voulais un bon comportement de sélection par typage, donc je l'ai implémenté moi-même. Je sélectionne les entrées en utilisant SetCurSel, puis en envoyant un message CBN_SELCHANGE à la fenêtre parente.
Sur Windows XP, cela a parfaitement fonctionné. Nous utilisons Windows 7 maintenant et le problème suivant se produit maintenant: Si j'utilise la souris pour ouvrir la liste déroulante, sélectionnez une entrée en la tapant, puis utilisez Tab pour passer au contrôle suivant, la valeur qui a été sélectionnée au début est automatiquement resélectionné.
Si j'Ecraser onKillFocus et procédez comme suit:
int index = GetCurSel();
CComboBox::OnKillFocus();
SetCurSel(index);
cela fonctionne en général, mais pour un moment l'ancienne valeur sélectionnée clignote toujours jusqu'à ce qui est laid.
Si je n'appelle pas CComboBox :: OnKillFocus() l'entrée correcte reste sélectionnée, mais la liste déroulante reste déroulée. Mon prochain essai a été d'appeler SetDropDown (FALSE) manuellement (et rien d'autre dans OnKillFocus()), mais le problème réapparaît.
Donc, je suppose que si vous ouvrez la liste déroulante la sélection actuelle est stockée en interne. L'appel de SetCurSel ne met pas à jour cette valeur interne. Et si vous tabulez cette valeur interne est à nouveau sélectionnée.
Des idées comment je peux résoudre ce problème?