Отключение автозаполнения для ComboBox

Стандартный ComboBox Windows/MFC (раскрывающийся режим) имеет функцию автозаполнения, которую я хотел бы отключить, но не знаю, как это сделать.

Пример 1: Создайте ComboBox со значениями списка «Abc» и «Def». Введите «A» в качестве значения редактирования и используйте кнопку раскрывающегося списка. «A» будет изменено на «Abc».

Пример 2: одинаковые начальные значения. Откройте раскрывающийся список, введите «A» в качестве значения для редактирования и нажмите TAB. «A» будет изменено на «Abc».

Эти примеры работают даже в тестовом режиме диалогового редактора Visual Studio IDE. Не требуется скомпилированный exe.

Изменение с «A» на «Abc», вероятно, является особенностью, но покупателю это не нужно. Есть ли способ предотвратить это?


person user178379    schedule 20.08.2013    source источник
comment
Решил это более или менее, написав свой собственный почти как поле со списком...   -  person user178379    schedule 24.08.2013


Ответы (1)


Вы можете точно настроить поведение автозаполнения любого элемента управления Edit, вызвав SHAutoComplete. Чтобы получить дескриптор части управления редактированием ComboBox, отправьте CBEM_GETEDITCONTROL сообщение элементу управления ComboBox.

Чтобы удалить нежелательную функцию, флаги для SHAutoComplete не должны включать SHACF_USETAB.

person IInspectable    schedule 20.08.2013
comment
Спасибо, звучит хорошо, но не работает. Я только что протестировал его с помощью SHACF_AUTOAPPEND_FORCE_OFF|SHACF_AUTOSUGGEST_FORCE_OFF для диалогового окна, поля со списком и управления редактированием полей со списком. Все возвращают S_OK, но проблема остается. - person user178379; 20.08.2013
comment
Для обоих флагов в документации требуется следующее: Этот флаг должен использоваться в сочетании с одним или несколькими флагами SHACF_FILESYS* или SHACF_URL* . - person IInspectable; 20.08.2013
comment
Упс, ты прав конечно. Пробовал через SHACF_AUTOAPPEND_FORCE_OFF|SHACF_AUTOSUGGEST_FORCE_OFF|SHACF_FILESYSTEM|SHACF_URLALL. Опять все возвращают S_OK, но проблема остается. - person user178379; 20.08.2013
comment
Использовал только SHACF_DEFAULT просто так, и это дало интересный эффект: я смог автоматически заполнять URL-адреса и пути с помощью своего поля со списком. Итак, мой вызов применяется к правильному HWND. Я думаю, что эта функция была сделана только для настройки автозаполнения URL/пути, а не для автозаполнения выпадающими данными... - person user178379; 20.08.2013
comment
@user Кажется, вы правы, SHAutoComplete действительно предназначен только для файлов / папок / пространств имен оболочки. Чтобы отключить автозаполнение, кажется, вам нужно создать IAutoComplete COM-объект и реализовать тривиальный источник IEnumString, который ничего не возвращает. Возможно, вам также придется настроить поведение, вызвав IAutoComplete2::SetOptions. Поскольку ATL, как известно, недостаточно документирован и перегружен, я не удивлюсь, если в нем уже есть все ингредиенты, готовые к сборке. - person IInspectable; 21.08.2013
comment
Эх, тоже не смог заставить это работать. Но это может быть моя вина, эти COM вещи довольно сложны. Я использовал codeproject.com/Articles/2371/ реализовать его, но фактически никак не мог отключить автозаполнение. Я тоже не уверен, что это правильный путь. Документация для IAutoComplete относится к элементам управления редактированием и выпадающему списку. Но не упоминает обычные поля со списком. - person user178379; 21.08.2013