MFC CComboBox OnKillFocus/ShowDropDown после SetCurSel в Windows 7
Как вы, возможно, знаете, CComboBox (стиль DropDownList) выбирает только правильно, печатая, если вы не позволяете ему автоматически сортировать его содержимое. Вот пример того, что я имею в виду: вы вводите A, а затем B. Если он не находится на автосортировке, он сначала выберет следующую запись, начинающуюся с A, а затем следующую запись, начинающуюся с B. Если она отсортирована, он выберет следующую запись. с А, а затем следующий, начиная с АВ.
У меня есть класс, который наследуется от CComboBox, и его содержимое не сортируется встроенным механизмом сортировки. Я хотел правильного выбора при наборе текста, поэтому я реализовал это сам. Я выбираю записи, используя SetCurSel, а затем отправляю сообщение CBN_SELCHANGE в родительское окно.
На Windows XP это работало отлично. Мы используем Windows 7 сейчас, и теперь возникает следующая проблема: если я использую мышь, чтобы открыть раскрывающийся список, выберите запись, напечатав ее, а затем используйте клавишу Tab для перехода к следующему элементу управления, значение, которое было выбрано в начале: автоматически выбирается заново.
Если я перезаписываю OnKillFocus и делаю следующее:
int index = GetCurSel();
CComboBox::OnKillFocus();
SetCurSel(index);
это работает в общем, но на мгновение старое выбранное значение все еще будет мигать, что некрасиво.
Если я не вызываю CComboBox::OnKillFocus(), правильная запись остается выбранной, но поле со списком остается выпадающим.
Поэтому моей следующей попыткой было вызвать SetDropDown(FALSE) вручную (и ничего больше в OnKillFocus()), но затем проблема снова появляется.
Поэтому я предполагаю, что если вы откроете выпадающий список, текущий выбор будет сохранен внутри. Вызов SetCurSel не обновляет это внутреннее значение. И если вы вкладываете, это внутреннее значение снова выбирается снова.
Любые идеи, как я могу решить эту проблему?
1 ответ
Только непроверенные идеи:
Переопределить обработку CB_SHOWDROPDOWN. Если раскрывающийся список закрыт, возможно, вызовите SetCurSel для сохраненного элемента.
Переопределить обработку CB_SETCURSEL, флаг добавления, указывающий, обрабатывать ли сообщение CB_SETCURSEL. Выключите флаг времени вызова CComboBox::OnKillFocus() в вашем примере кода.