P>>Не подскажете где икать информацию по реализации сабжа, P>>под сабжем подразумеваю следующее: P>> И как он правильно называется. A>Называется это Auto Complete. Начать поиск можно с функции SHAutoComplete и интерфейса IAutoComplete. SHAutoComplete — самый простой способ, но он позволяет вводить только URL'ы и имена файлов. Если тебе нужно запоминать любой текст, то придется юзать IAutoComplete. Для этого создаешь объект
и инициализируешь его
Вторым параметром передается интерфейс, управляющий выводом строк в выпадающий список, их хранением и т.д. Он должен уметь предоставлять интерфейс IEnumSrting. Чтобы долго не мучаться я поступил просто: создал класс, производный от IEnumSrting
и реализовал все требуемые методы. В частности, QueryInterface выглядит так:
Методы IEnumString'а (Next, Skip, Reset) реализуешь сам в зависимости от того, где будут храниться запомненные строки. Самый сложный вопрос, на который мне так никто и не ответил Автор: SWW заключается в том, как удалять ненужные строки. Но мне таки удалось это сделать. Оказывается, еще есть интерфейс IAutoCompleteDropDown котрый в MSDN почему-то не описан. Получить его можно из IAutoCompleteДата: 15.02.05
В нем есть два метода: ResetEnumerator(void) и GetDropDownStatus(/*[out]*/ DWORD *pdwFlags, /*[string][out]*/ LPWSTR *ppwszString). Первый вызывает повторное заполнение списка, а с помощью второго можно получить информацию о текущем состоянии вывавшего списка. Для этого я встроил его в PreTranslateMessage и проверяю: если нажата клавиша <del> && список при этом открыт, то вызывается функция CStringStorage для удаления выделенной строки:
PostMessage(WM_KEYDOWN, VK_DOWN) нужен для того, чтобы вновь отобразить выпавший список с новым содержимым (т.к. после нажатия на <del> он закрывается). |