Правильное возвращаемое значение для TVN_KEYDOWN
Я совсем недавно ответил на вопрос о создании TreeView с узлами и флажками.
Пока я размышлял, как правильно обработать случай, когда treeview
узел проверяется, когда пользователь нажимает пробел, я столкнулся TVN_KEYDOWN
уведомление.
Мое решение было протестировано в диалоговом окне и в оконной процедуре, и оба, кажется, работают безупречно.
Тем не менее, у меня есть дилемма, каким должен быть мой возвращенный результат. Вот соответствующая выдержка из документации для TVN_KEYDOWN
:
Возвращаемое значение
Если член wVKey в lParam представляет собой символьный код клавиши, этот символ будет использоваться как часть инкрементного поиска. Вернуть ненулевое значение, чтобы исключить символ из добавочного поиска, или ноль, чтобы включить символ в поиск. Для всех остальных ключей возвращаемое значение игнорируется.
Я пытался вернуть оба результата при тестировании, если нажата пробел, и не заметил никакой разницы.
Поэтому я задаю вам следующие вопросы:
Может кто-нибудь объяснить мне, что такое инкрементальный поиск?
Какая разница, когда я включаю или исключаю проверенный символ (пробел) из добавочного поиска?
РЕДАКТИРОВАТЬ:
Кажется, я нашел ответ на первый вопрос. Я нашел статью в Википедии, которая объясняет, что такое инкрементальный поиск.
Остается ответить только на второй вопрос.
Конец редактирования
Спасибо.
С наилучшими пожеланиями.
2 ответа
Это наиболее заметно в гигантском TreeView. Лучшим примером является левая панель в Regedit.exe. Разверните HKCR и начните печатать, чтобы увидеть эффект.
Реализация изменилась во всех версиях Windows, раньше она была гораздо менее полезной в XP. Это блокиратор пользовательского интерфейса, для пользователя не существует какого-либо хорошего способа увидеть, что он неправильно набрал букву, исправить ошибку ввода или увидеть, что поиск начинается с нуля. Текущие версии Windows используют тайм-аут, автоматически сбрасывая частично набранную поисковую фразу, когда вы не нажимаете клавишу в течение нескольких секунд. Что примерно так же практично, как и получается. Это, безусловно, полезно, но не очень удобно.
Единственное вменяемое, что нужно сделать с TVN_KEYDOWN - это ничего. Никогда не добавляйте больше способов сделать его менее предсказуемым, чем оно есть. Преднамеренное проглатывание клавиши, конечно, делает ее намного менее удобной, если это ключ, который пользователь действительно хотел использовать. Вы, конечно, не хотите глотать пробел, это, конечно, допустимый символ в тексте узла дерева. Если в дереве нет узлов с текстом, содержащим пробел, вы все равно не хотите его проглотить, сам элемент управления уже это делает.
Уведомление было бы намного более полезным, если бы оно также передавало собранную строку инкрементного поиска или давало способ сбросить ее. Просто нет, это вода под мостом. Подумайте об этом, если вы создали какую-то ловушку юзабилити, очень трудно придумать практический пример. Вы знаете это, когда видите это.
Единственное реальное использование - полностью заменить функцию поиска. Затем вы сами создадите свои правила и выберете узел. И, конечно же, всегда возвращайте ненулевое значение.
Вы хотите только ответить на второй вопрос, так что это:
Если вы исключите пробел из инкрементального поиска, вы не найдете элемент просмотра с пробелом.
Примечание: Вы должны отключить стиль TVS_CHECKBOXES, потому что древовидная структура wndproc обрабатывает пробел, отличный от этого набора стилей.