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() в вашем примере кода.

Другие вопросы по тегам