VirtualTreeView:如何检查节点是否可见

4
如何使用VirtualTreeView组件检查节点是否可见(在屏幕上)?类似于这样:
if not Grid.NodeVisible (Node) then
   Grid.ScrollIntoView (Node, True);

节点如果不可见,则应该居中,但如果可见,则保持在原位置。
请注意,我所说的不是节点的可见标志,而是屏幕上的可见性。 在我的情况下,IsVisible属性始终返回True。

1
现在我认为没有这样的属性或函数。也许可以使用 GetDisplayRect,并检查与树形视图的裁剪矩形的交集。 - TLama
2个回答

3

我认为最接近的方法是 GetDisplayRect()

根据滚动、展开状态等确定给定节点覆盖的客户端坐标。如果无法找到给定节点(因为其中一个父节点被折叠或不可见),则返回一个空矩形。

不确定在节点“可见但超出视野”的情况下它返回什么 - 您可能需要编写帮助程序函数来检查返回的矩形是否在VT的客户端矩形内...


没错,问题是为什么要检查这个,如果ScrollIntoView已经为您完成了这个操作。 - TLama
1
@TLama 因为 ScrollIntoView 没有我想要的行为:如果节点不可见,则我希望它居中,但如果已经可见,则保持在原位。这不能仅通过 ScrollIntoView 实现。 - jpfollenius
没错,它的返回值甚至可以指示是否进行了任何滚动...然而,原帖中写道"类似于",所以也许他实际上需要在ScrollIntoView调用之前检查其他情况下的使用方式。 - ain
1
您提到的辅助功能的实现可在https://dev59.com/nn3aa4cB1Zd3GeqPc2t-#22298304中找到。 - JRL
@jpfollenius 如果它是可见的,就保持在原位,这似乎正是由.ScrollIntoView(Node, Center := False)完成的,来自于VTV源码中的这段代码:R := GetDisplayRect(Node,..... if (R.Bottom > ClientHeight) or Center then begin.... - undefined

0

IsVisible属性仅返回节点是否已隐藏,正如您所发现的那样。要找出节点是否在屏幕上,唯一的方法是使用GetDisplayRect并将其与树视图的客户端矩形进行测试,就像ain建议的那样。

然而,如果我正确理解您想做什么,VirtualTreeView的SelectionOption中的toCenterScrollIntoView选项将为您提供所需的行为,而无需测试节点是否在可见区域内。

即(C++):

TreeView->TreeOptions->SelectionOptions =
TreeView->TreeOptions->SelectionOptions << toCenterScrollIntoView ;
...
ScrollIntoView(Node);

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