TVN_KEYDOWN的正确返回值

5

我最近回答了一个关于创建带有节点和复选框的TreeView的问题。

当我思考如何正确处理用户按下spacebar时检查了treeview的节点时,我遇到了TVN_KEYDOWN通知。

我的解决方案在对话框和窗口过程中都经过了测试,似乎都能够完美地工作。

然而,我现在有一个困惑,就是我应该返回什么结果。以下是来自TVN_KEYDOWN文档的相关摘录:

返回值

如果lParam的wVKey成员是字符键代码,则该字符将用作增量搜索的一部分。返回非零以从增量搜索中排除字符,或者返回零以包括搜索中的字符。对于所有其他键,返回值都将被忽略。

在测试是否按下spacebar时,我尝试了返回两种结果,并没有注意到任何区别。

所以我向你们提出以下问题:

  1. 有人能解释一下什么是增量搜索吗?

  2. 当我从增量搜索中包括或排除测试字符(spacebar)时有什么区别?

编辑:

看来我已经找到了第一个问题的答案。我在维基百科上找到了一篇解释增量搜索的文章。

现在只剩下第二个问题需要回答。

编辑结束

谢谢。

最好的问候。


尝试使用不带TVS_CHECKBOXES样式的带有以空格字符开头的一个项目。然后您将看到0返回值和1返回值之间的差异。 - Xearinox
@Xearinox:我已经按照你所说的删除了复选框,并在第二个子项的标题中添加了2个空格,但性能没有改善。再次阅读注释部分后,我发现 wVKey 必须是一个字符,所以我将我的代码更改为测试 0x54,即 t,但仍然没有看到性能差异。请问我错过了什么?谢谢。最好的问候。 - AlwaysLearningNewStuff
你只需要给一个项目添加空格。 - Xearinox
2个回答

4
在一个巨大的TreeView中,这一点最为明显。最好的例子是Regedit.exe中的左侧面板。展开HKCR并开始输入以查看效果。
实现在Windows版本间有所改变,在XP中,它的可用性要低得多。这是一种UI失误,用户没有任何很好的方法可以看到他打错了一个字母,纠正输入错误或者看到搜索从头开始。Windows的当前版本使用超时功能,当你几秒钟内没有按键时自动重置部分输入的搜索短语。这几乎是最实用的方法了。它肯定是有用的,只是不太容易理解。
TVN_KEYDOWN的唯一合理做法是什么都不做。不要比它已经不可预测的做法更增加其他方式。故意吞咽一个键击当然会使它的可用性降低很多,如果它是用户真正想使用的键。当然,你肯定不想吞咽空格,因为它在树节点文本中是有效的字符。如果树上没有任何包含空格的文本节点,你仍然不想吞咽它,控件本身已经处理了这个问题。
如果通知也传递了收集的增量搜索字符串或者提供了重置的方法,那么它将更加有用。但它并没有,所以没办法了。如果你创建了某种可用性陷阱,则考虑处理它。很难提出一个实际的例子。当你看到时,你就会知道。
唯一真正的用途是完全替代搜索功能。然后你会制定自己的规则并选择一个节点。当然,总是返回非零值。

唯一真正的用途是完全替换搜索功能。然后您将制定自己的规则并选择一个节点。当然,始终返回非零值。我仅使用TVN_KEYDOWN来确定节点是否已选中。在执行检查后,我希望保留默认行为,请参见我在帖子中链接的WM_NOTIFY的简短代码片段,以更好地了解我所说的内容(它在第一句话中)。在这种情况下,我也应该返回非零吗?谢谢。最好的问候。 - AlwaysLearningNewStuff
我也有一个类似的任务要实现,涉及到树形视图控件。OP链接的答案解决了这个问题,但由于我将使用他的解决方案,我将面临与他相同的返回值困境。我想知道在他处理消息时应该返回哪个值以保留默认行为(OP只是在按下空格键时使用此消息来获取树的检查状态,因此不需要更改任何内容)? - user3261013

2

您只想回答第二个问题,因此答案是:

如果在增量搜索中排除空格键,则无法使用空格键找到treeview项目。

注意:您必须禁用TVS_CHECKBOXES样式,因为带有此样式集的树形视图wndproc处理空格键时会有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接