Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Автозавершение для ComboBox


Автор: suxxor 3.8.2011, 23:16
На окне присутствует ComboBox с уже заполненными строками, как сделать чтобы при вводе текста в ComboBox для автозавершения по введённой строке?

К примеру ввожу "String" и он выдаёт все подходящие варианты из существующего списка (например "String Get")

user posted image

Нашёл только примеры на Delphi, C# на встроенных библиотеках, а нужно на WinAPI

Автор: Earnest 4.8.2011, 06:45
Да вроде бы ничего сложного:
Обрабатывай ввод символа (скажем, уведомление EN_CHANGE на комбобоксе, если сабклассишь его, либо CBN_CHANGED). В обработчике пытаешься найти подходящий элемент списка; если нашел - выводи в редактор комбобокса (SetWindowText), но сначала запомни текущую позицию, чтобы поставить выделение с этого символа до конца строки.

Автор: suxxor 4.8.2011, 13:56
Цитата(Earnest @ 4.8.2011,  06:45)
... но сначала запомни текущую позицию, чтобы поставить выделение с этого символа до конца строки.

это не понимаю

Автор: Earnest 4.8.2011, 16:51
Тебе нужно поставить выделение, начиная с символа, который пользователь не вводил, до конца строки, чтобы при следующем вводе оно заменилось на новый введенный символ. Выделение ставится через сообщение EM_SETSEL, параметром является диапазон. Если пользователь ввел, как на картинке "fr", т.е. 2 символа, то текущая позиция 2, надо выделять с 2 до конца строки. Другими словами, текущую позицию ты получаешь, просто спросив длину введенной пользователем строки.

Автор: suxxor 4.8.2011, 17:49
Код

case WM_NOTIFY:
    switch((LPNMHDR)lParam->code)
    {
        case CBN_CHANGED: // или CBN_EDITCHANGE ?
            // тут чё делать?
    }

    break;

Автор: Earnest 4.8.2011, 18:26
1) Для начала посмотреть в MSDN и понять кто посылает WM_NOTIFY, а кто WM_COMMAND.
2) Уведомление CBN_EDITCHANGE, да.
3) Что делать - все расписано в предыдущих постах. Задавай конкретные вопросы. Уж извини, полный ликбез в программу мероприятий не входит, это сам. smile 

Автор: suxxor 4.8.2011, 19:31
Извиняюсь, привык что notify обрабатывать в WM_NOTIFY

Код

case WM_COMMAND:
    if(HIWORD(wParam) == CBN_CHANGED)
    {
           if(LOWORD(wParam) == IDC_COMBOBOX) //  Идентификатор комбобокса
           {
                   // тут чё делать?
           }
    }
    break;

Автор: spyswamp 4.8.2011, 20:13
suxxor, "че тут делать"?

1. Получить введенный текст.
2. В цикле по всем элементам комбо-бокса найти первый, который начинается с введенного текста (case insensitive, само-собой).
3. Получить длину введенного текста.
4. Вставить найденный текст в строку ввода комбо-бокса.
5. Выделить текст в поле ввода комбо-бокса начиная с "длина строки" (ты его запомнил в пункте 3) и до конца строки (-1, либо общая длина уже выведенного текста - как больше нравится).

Вот и весь алгоритм, камрад. Читай MSDN. Тебя должно интересовать:
- получение введенного текста,
- цикл по элементам комбо-бокса,
- взятие текста у элемента комбо-бокса,
- изменение введенного текста,
- выделение введенного текста.

Дерзай, емана!  smile 

Автор: Antonsaer 17.8.2011, 14:08
http://kvartiry-vtroicke.ru/  получилось

Автор: spyswamp 17.8.2011, 14:30
Ну слава богу.  smile 

Автор: 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
Цитата(Dem_max @ 25.8.2011,  04:29)
А зачем ОС заставлять то ? Может поддержка в ОС с Win 7 тока.

Хмммм.... по сути за нас итак чуть более чем всё делает сама ОСЪ, просто некоторым это не видно (или просто не знают). Класс поддерживается начиная с windows 2k

Автор: spyswamp 25.8.2011, 11:01
Я бы не стал использовать COM вообще. Нигде.  smile СМЕРТЬ COM'у.

Автор: suxxor 25.8.2011, 11:55
spyswamp, я тоже за это, но самому лень писать код
Antonsaer походу не в той теме отписался или чё с ним?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)