Правильное возвращаемое значение для TVN_KEYDOWN

Я совсем недавно ответил на вопрос о создании TreeView с помощью узлы и флажки.

Пока я размышлял, как правильно обработать случай, когда узел treeview проверяется, когда пользователь нажимает пробел, я столкнулся с _ 2_ уведомление.

Мое решение было протестировано в диалоговом окне и в оконной процедуре, и оба, похоже, работают безупречно.

Тем не менее, у меня есть дилемма, каким должен быть мой возвращенный результат. Вот соответствующий отрывок из документации для TVN_KEYDOWN:

Возвращаемое значение

Если член wVKey lParam является кодом клавиши символа, этот символ будет использоваться как часть инкрементного поиска. Верните ненулевое значение, чтобы исключить символ из возрастающего поиска, или ноль, чтобы включить символ в поиск. Для всех остальных ключей возвращаемое значение игнорируется.

Я попытался вернуть оба результата при проверке, нажата ли пробел и не заметил никакой разницы.

Поэтому я задаю вам следующие вопросы:

  1. Может кто-нибудь объяснить мне, что такое инкрементальный поиск?

  2. В чем разница, когда я включаю или исключаю проверенный символ (пробел) из инкрементального поиска?

РЕДАКТИРОВАТЬ:

Кажется, я нашел ответ на первый вопрос. Я нашел статью в Wikipedia, в которой объясняется, что такое инкрементный поиск .

Остается ответить только на второй вопрос.

КОНЕЦ РЕДАКТИРОВАНИЯ

Спасибо.

С наилучшими пожеланиями.


person AlwaysLearningNewStuff    schedule 17.03.2014    source источник
comment
Попробуйте без TVS_CHECKBOXES стиль a с одним элементом, начинающимся с символа пробела. Затем вы видите разницу между 0 возвращаемым значением и 1 возвращаемым значением.   -  person Xearinox    schedule 17.03.2014
comment
@Xearinox: Я удалил флажки, как вы сказали, и добавил 2 пробела в заголовке второго подпункта. По-прежнему никакой разницы в производительности. Еще раз перечитав раздел примечаний, я увидел, что wVKey должен быть символом, поэтому я изменил свой код, чтобы протестировать 0x54, который равен t, и по-прежнему не увидел разницы в производительности. Подскажите, пожалуйста, что мне не хватает? Спасибо. С наилучшими пожеланиями.   -  person AlwaysLearningNewStuff    schedule 19.03.2014
comment
Вы должны добавить место только к одному элементу.   -  person Xearinox    schedule 19.03.2014


Ответы (2)


Это наиболее заметно в гигантском TreeView. Лучший пример - левая панель в Regedit.exe. Разверните HKCR и начните печатать, чтобы увидеть эффект.

Реализация изменилась в версиях Windows, раньше она была менее удобна для использования в XP. Это ошибка пользовательского интерфейса, у пользователя нет никакого хорошего способа увидеть, что он набрал букву, исправить опечатку или увидеть, что поиск начинается с нуля. Текущие версии Windows используют тайм-аут, автоматически сбрасывая частично набранную поисковую фразу, если вы не нажимаете клавишу в течение нескольких секунд. Это настолько практично, насколько это возможно. Это, безусловно, полезно, но не очень удобно.

Единственное, что можно сделать с TVN_KEYDOWN, - это ничего. Никогда не добавляйте больше способов сделать его менее предсказуемым, чем он есть. Умышленное проглатывание нажатия клавиши, конечно, делает его партией менее пригодными для использования, если пользователь действительно хотел использовать этот ключ. Вы, конечно, не хотите проглатывать пробел, это, конечно, допустимый символ в тексте узла дерева. Если в дереве нет каких-либо узлов с текстом, содержащим пробел, тогда вы по-прежнему не хотите его проглатывать, сам элемент управления уже имеет.

Уведомление было бы намного полезнее, если бы оно также передавало строку инкрементного поиска, которая была собрана, или давала возможность ее сбросить. Это просто не так, это вода под мостом. Подумайте о том, чтобы справиться с этим, если вы создали какую-то ловушку юзабилити, и очень сложно придумать ее практический пример. Вы знаете это, когда видите это.

Единственное реальное использование - полностью заменить функцию поиска. Затем вы создадите свои собственные правила и сами выберете узел. И, конечно же, всегда возвращает ненулевое значение.

person Hans Passant    schedule 19.03.2014
comment
Единственное реальное использование - полностью заменить функцию поиска. Затем вы создадите свои собственные правила и сами выберете узел. И, конечно, всегда возвращайте ненулевое значение. Я использую TVN_KEYDOWN только для того, чтобы определить, отмечен ли узел. Я хотел бы сохранить поведение по умолчанию после выполнения проверки. Просмотрите фрагмент короткого кода для WM_NOTIFY, на который я указал в своем сообщении, чтобы лучше понять, о чем я говорю (он находится в первом предложении). Должен ли я возвращать ненулевое значение и в этом случае? Спасибо. С наилучшими пожеланиями. - person AlwaysLearningNewStuff; 21.03.2014
comment
У меня также есть аналогичная задача для управления древовидным списком. Ответ OP, связанный с этим, решает эту проблему, но, поскольку я буду использовать его решение, у меня будет та же дилемма о возвращаемом значении, что и у него. Я хотел бы знать, какое значение мне следует return в его обработке сообщения, чтобы сохранить поведение по умолчанию (OP просто использовал это сообщение, чтобы получить состояние проверки деревьев при нажатии клавиши пробела, поэтому нет необходимости что-либо менять)? - person ; 24.03.2014

Вам нужен только ответ на второй вопрос, так что это:

Если вы исключите пробел из инкрементального поиска, вы не найдете элемент trewview с пробелом.

Примечание: вы должны отключить стиль TVS_CHECKBOXES, потому что treeview wndproc обрабатывает пробел, отличный от этого набора стилей.

person Xearinox    schedule 19.03.2014