MFC CComboBox OnKillFocus / ShowDropDown после SetCurSel в Windows 7 - PullRequest
0 голосов
/ 26 марта 2010

Как вы, возможно, знаете, CComboBox (стиль DropDownList) выбирает только правильно, печатая, если вы не позволяете ему автоматически сортировать его содержимое. Вот пример того, что я имею в виду: Вы вводите A, а затем B. Если он не находится на автосортировке, он сначала выберет следующую запись, начинающуюся с A, а затем следующую запись, начинающуюся с B. Если она отсортирована, он выберет следующую запись с A, а затем следующую, начинающуюся с AB.

У меня есть класс, который наследуется от CComboBox, и его содержимое не сортируется встроенным механизмом сортировки. Я хотел правильного выбора при наборе текста, поэтому я реализовал это сам. Я выбираю записи с помощью SetCurSel и затем отправляю сообщение CBN_SELCHANGE в родительское окно.

В Windows XP это работало отлично. Сейчас мы используем Windows 7, и сейчас возникает следующая проблема: Если я использую мышь, чтобы открыть раскрывающийся список, выберите запись, напечатав ее, а затем используйте клавишу «Tab» для перехода к следующему элементу управления, значение, выбранное в начале, будет автоматически выбрано заново.

Если я перезаписываю OnKillFocus и выполняю следующие действия:

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

это работает в общем, но на мгновение старое выбранное значение все еще вспыхнет, что ужасно.

Если я не вызываю CComboBox :: OnKillFocus (), правильная запись остается выбранной, но поле со списком остается выпадающим.

Итак, моей следующей попыткой было вызвать SetDropDown (FALSE) вручную (и ничего больше в OnKillFocus ()), но затем проблема снова появляется.

Так что я предполагаю, что если вы откроете выпадающий список, текущий выбор будет сохранен внутри. Вызов SetCurSel не обновляет это внутреннее значение. И если вы выделите это внутреннее значение, оно будет снова выбрано.

Любые идеи, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 26 марта 2010

Только непроверенные идеи:

  • Переопределить обработку CB_SHOWDROPDOWN. Если раскрывающийся список закрыт, возможно, вызовите SetCurSel для хранимого предмета.

  • Переопределить обработку CB_SETCURSEL, флаг добавления, указывающий, обрабатывать ли сообщение CB_SETCURSEL. Отключите флаг времени вызова CComboBox :: OnKillFocus () в вашем примере кода.

...