Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автозавершение для ComboBox 
:(
    Опции темы
suxxor
Дата 3.8.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



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

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

user posted image

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

Это сообщение отредактировал(а) suxxor - 3.8.2011, 23:18
PM   Вверх
Earnest
Дата 4.8.2011, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
suxxor
Дата 4.8.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



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

это не понимаю
PM   Вверх
Earnest
Дата 4.8.2011, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
suxxor
Дата 4.8.2011, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Код

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

    break;

PM   Вверх
Earnest
Дата 4.8.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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


--------------------
...
PM   Вверх
suxxor
Дата 4.8.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Извиняюсь, привык что notify обрабатывать в WM_NOTIFY

Код

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


Это сообщение отредактировал(а) suxxor - 4.8.2011, 19:32
PM   Вверх
spyswamp
Дата 4.8.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: нет
Всего: 7



suxxor, "че тут делать"?

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

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

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


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Antonsaer
Дата 17.8.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.8.2011

Репутация: нет
Всего: нет



user posted image  получилось
PM MAIL   Вверх
spyswamp
Дата 17.8.2011, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: нет
Всего: 7



Ну слава богу.  smile 


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Dem_max
Дата 18.8.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



кидай код сюда


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
suxxor
Дата 25.8.2011, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Antonsaer, код в студию!

а можно заставить саму ОС это делать (через COM-интерфейс)

How to Enable Autocomplete Manually (MSDN)

вопрос - как использовать IEnumString в вышеуказанном примере?

Это сообщение отредактировал(а) suxxor - 25.8.2011, 01:51
PM   Вверх
Dem_max
Дата 25.8.2011, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



А зачем ОС заставлять то ? Может поддержка в ОС с Win 7 тока.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
suxxor
Дата 25.8.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



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

Хмммм.... по сути за нас итак чуть более чем всё делает сама ОСЪ, просто некоторым это не видно (или просто не знают). Класс поддерживается начиная с windows 2k
PM   Вверх
spyswamp
Дата 25.8.2011, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: нет
Всего: 7



Я бы не стал использовать COM вообще. Нигде.  smile СМЕРТЬ COM'у.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
suxxor
Дата 25.8.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



spyswamp, я тоже за это, но самому лень писать код
Antonsaer походу не в той теме отписался или чё с ним?
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.