2012-03-20 148 views
4

如何使用VirtualTreeView组件检查节点是否可见(屏幕上)?事情是这样的:VirtualTreeView:检查节点是否可见

if not Grid.NodeVisible (Node) then 
    Grid.ScrollIntoView (Node, True); 

节点应该是居中的,如果它是不可见的,但仍然它在哪里,如果它是可见的。

请注意,我不是在谈论节点的可见标志,而是关于屏幕上的可见性。 对我而言,IsVisible属性总是返回True

+1

现在我不认为有这样的属性或功能。也许'GetDisplayRect'并检查树视图剪切矩形的交点。 – TLama 2012-03-20 08:39:40

回答

3

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

确定客户坐标给定节点覆盖,这取决于滚动,拓邦等 如果无法找到指定的节点(因为一个的父母已经崩溃或者看不见),那么返回一个空的 矩形。

不知道它返回的情况下,节点是“看得见,在视野” - 你可能需要写一个检查是VT的客户矩形内返回的矩形辅助函数...

+0

+1,没错。仍然问题是为什么要检查这个,如果'ScrollIntoView'为你做这个。 – TLama 2012-03-20 08:54:38

+1

@TLama因为'ScrollIntoView'没有我想要的行为:我想要节点居中,如果它不可见,但保持它的位置,如果它是可见的。这不能通过单独的ScrollIntoView来实现。 – jpfollenius 2012-03-20 09:09:32

+0

的确,它的返回值甚至表明是否有任何滚动操作完成......但是,OP写了“Something like”,所以也许在除了ScrollIntoView调用之前检查其他情况下实际上需要它。 – ain 2012-03-20 09:11:40

0

的ISVISIBLE属性仅在节点已隐藏或未找到时返回。查找节点是否在屏幕上的唯一方法是使用建议的GetDisplayRect,然后根据树视图的客户端矩形对其进行测试。

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

即(C++):

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