为什么树结点不能在树控件中重复使用

为什么树结点不能在树控件中重复使用

作者:BlogUpdater |  时间:2021-04-25 |  浏览:493 |  评论已关闭 条评论

其实,主要的原因是:我们希望在易用性与通用性之间的取得某种平衡。
从字面意义上来说,你不能在一个树控件中的多个地方使用相同的树结点,因为如果你这样做的话,则树结点的某些属性会产生歧义,例如树结点的父结点TVGN_PARENT或者树结点是否展开TVIS_EXPANDED。(例如,如果一个树被使用到两个不同的地方,则它就会有两个不同的父结点。)

当然了,这个问题可以通过使用树结点的实际内容的不同加以区分。所以,我们用HTREENODE和HTREENODECONTENTS来代表树结点,而不是HTREEITEM句柄。

这个结点可以用来代表一个树结点位于树控件的物理位置,而结点内容可以用来代表树结点的实际内容,例如树结点的名称,图标等。
这很容易实现,但是要考虑一些其他的问题:为了用在十分少见的场景下,你正在努力使一个普通的案例变得困难。现在,每个操作树控件的开发者都必须担心待操作的对象数量增加了一倍(以前是一个树结点,现在是一个结点加上结点的内容)。

在设计接口时,这通常不是你想要达到的平衡,你可能希望使普通情况比稀有情况实现起来更加容易一点。

当然,需要这种分离的程序可以手动进行分离。具体来说,就是将所有内容放在单独的可共享结构中,并让HTREEITEM在其lParam中引用该共享结构。 对于程序来说,这意味着更多的工作,但是我们那些想要更多定制功能的用户会分担其中一部分的工作。

总结
将界面和逻辑分离,是一种十分好的设计,界面通常很容易发生需求变更,如果将业务逻辑和界面解耦,则可以实现:界面的改动不影响下层的业务逻辑。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why can’t I use the same tree item multiple times?》

评论已关闭。