| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Автозавершение для ComboBox |
| Автор: suxxor 3.8.2011, 23:16 |
| На окне присутствует ComboBox с уже заполненными строками, как сделать чтобы при вводе текста в ComboBox для автозавершения по введённой строке? К примеру ввожу "String" и он выдаёт все подходящие варианты из существующего списка (например "String Get") ![]() Нашёл только примеры на Delphi, C# на встроенных библиотеках, а нужно на WinAPI |
| Автор: Earnest 4.8.2011, 06:45 |
| Да вроде бы ничего сложного: Обрабатывай ввод символа (скажем, уведомление EN_CHANGE на комбобоксе, если сабклассишь его, либо CBN_CHANGED). В обработчике пытаешься найти подходящий элемент списка; если нашел - выводи в редактор комбобокса (SetWindowText), но сначала запомни текущую позицию, чтобы поставить выделение с этого символа до конца строки. |
| Автор: suxxor 4.8.2011, 13:56 | ||
это не понимаю |
| Автор: Earnest 4.8.2011, 16:51 |
| Тебе нужно поставить выделение, начиная с символа, который пользователь не вводил, до конца строки, чтобы при следующем вводе оно заменилось на новый введенный символ. Выделение ставится через сообщение EM_SETSEL, параметром является диапазон. Если пользователь ввел, как на картинке "fr", т.е. 2 символа, то текущая позиция 2, надо выделять с 2 до конца строки. Другими словами, текущую позицию ты получаешь, просто спросив длину введенной пользователем строки. |
| Автор: suxxor 4.8.2011, 17:49 | ||
|
| Автор: Earnest 4.8.2011, 18:26 |
| 1) Для начала посмотреть в MSDN и понять кто посылает WM_NOTIFY, а кто WM_COMMAND. 2) Уведомление CBN_EDITCHANGE, да. 3) Что делать - все расписано в предыдущих постах. Задавай конкретные вопросы. Уж извини, полный ликбез в программу мероприятий не входит, это сам. |
| Автор: suxxor 4.8.2011, 19:31 | ||
Извиняюсь, привык что notify обрабатывать в WM_NOTIFY
|
| Автор: spyswamp 4.8.2011, 20:13 |
| suxxor, "че тут делать"? 1. Получить введенный текст. 2. В цикле по всем элементам комбо-бокса найти первый, который начинается с введенного текста (case insensitive, само-собой). 3. Получить длину введенного текста. 4. Вставить найденный текст в строку ввода комбо-бокса. 5. Выделить текст в поле ввода комбо-бокса начиная с "длина строки" (ты его запомнил в пункте 3) и до конца строки (-1, либо общая длина уже выведенного текста - как больше нравится). Вот и весь алгоритм, камрад. Читай MSDN. Тебя должно интересовать: - получение введенного текста, - цикл по элементам комбо-бокса, - взятие текста у элемента комбо-бокса, - изменение введенного текста, - выделение введенного текста. Дерзай, емана! |
| Автор: Antonsaer 17.8.2011, 14:08 |
| http://kvartiry-vtroicke.ru/ получилось |
| Автор: spyswamp 17.8.2011, 14:30 |
| Ну слава богу. |
| Автор: Dem_max 18.8.2011, 20:11 |
| кидай код сюда |
| Автор: suxxor 25.8.2011, 01:50 |
| Antonsaer, код в студию! а можно заставить саму ОС это делать (через COM-интерфейс) http://msdn.microsoft.com/en-us/library/hh127437%28v=vs.85%29.aspx вопрос - как использовать IEnumString в вышеуказанном примере? |
| Автор: Dem_max 25.8.2011, 04:29 |
| А зачем ОС заставлять то ? Может поддержка в ОС с Win 7 тока. |
| Автор: suxxor 25.8.2011, 09:31 | ||
Хмммм.... по сути за нас итак чуть более чем всё делает сама ОСЪ, просто некоторым это не видно (или просто не знают). Класс поддерживается начиная с windows 2k |
| Автор: spyswamp 25.8.2011, 11:01 |
| Я бы не стал использовать COM вообще. Нигде. |
| Автор: suxxor 25.8.2011, 11:55 |
| spyswamp, я тоже за это, но самому лень писать код Antonsaer походу не в той теме отписался или чё с ним? |