我最近回答了关于创建带有节点和复选框的TreeView的问题。
当我正在思考如何正确处理当用户按空格键检查treeview
的节点时,我遇到了TVN_KEYDOWN
通知。
我的解决方案在一个对话框和一个窗口程序中进行了测试,两者似乎都能完美地工作。
但是,对于返回的结果应该是什么,我仍然感到进退两难。以下是TVN_KEYDOWN
文档的相关摘录:
返回值如果lParam的wVKey成员是一个字符键代码,则字符将被用作增量搜索的一部分。返回非零从增量搜索中排除该字符,或者不包括任何字符搜索中的字符。对于所有其他键,返回值为忽略。
在测试空格是否按下并且没有注意到任何差异时,我尝试返回两个结果。
所以我问你以下问题:
-
谁能给我解释一下什么是增量搜索?
-
当我从增量搜索中包含或排除测试字符(空格)时,有什么不同?
编辑:
似乎我已经找到了第一个问题的答案。我在维基百科上找到了一篇文章,解释了增量搜索是什么。只剩下第二个问题待回答。
END OF EDIT
谢谢。
问好。
在一个巨大的TreeView中最明显。最好的例子是Regedit.exe的左面板。展开HKCR并开始输入以查看效果。
实现在Windows版本中发生了变化,在XP中它的可用性要差得多。这是一个UI漏洞,没有任何好的方法让用户看到他打错了一个字母,纠正打字错误或看到从头开始搜索。当前版本的Windows使用超时,当你几秒钟没有按下某个键时,会自动重置部分输入的搜索短语。这是最实际的了。它当然有用,只是不是很好用。
对TVN_KEYDOWN唯一相同的做法是nothing。永远不要添加更多的方法来让它变得更不可预测。如果一个键是用户真正想要使用的,那么故意吞下一个键击当然会使它的可用性降低很多。您当然不想占用空格,这当然是树节点文本中的有效字符。如果树碰巧没有任何包含空格文本的节点,那么您仍然不想吞下它,控件本身已经这样做了。
如果通知还传递收集的增量搜索字符串或提供重置它的方法,那么通知将会有用得多。它只是没有,所以那是过去的事了。如果你已经创造了一些可用性陷阱,那么考虑处理它,很难想出一个实际的例子。你一看到就知道了。
唯一真正的用途是完全取代搜索功能。然后,您可以制定自己的规则并自己选择节点。当然,总是返回一个非零值。
您只想要第二个问题的答案,所以这是:
如果你从增量搜索中排除空格键,你将找不到带有空格键的视图项。
注意:你必须禁用TVS_CHECKBOXES样式,因为treeview wndproc处理空格键与此样式设置不同。