【问题标题】:VirtualTreeView: Check if node is visibleVirtualTreeView:检查节点是否可见
【发布时间】:2012-03-20 08:14:51
【问题描述】:

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

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

如果节点不可见,则应居中,但如果可见,则保持原位。

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

【问题讨论】:

  • 现在我不认为有这样的属性或功能。也许GetDisplayRect 并检查与树视图的剪辑矩形的交集。

标签: delphi delphi-xe virtualtreeview


【解决方案1】:

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

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

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

【讨论】:

  • +1,没错。问题仍然是为什么要检查这个,如果ScrollIntoView 为你做这个。
  • @TLama 因为ScrollIntoView 没有我想要的行为:如果节点不可见,我希望节点居中,但如果节点可见,则保持原位。这是ScrollIntoView单独无法实现的。
  • 没错,它的返回值甚至表明是否完成了任何滚动......但是,OP 写了“类似的东西”,所以也许他实际上在其他情况下需要它,而不是在 ScrollIntoView 调用之前检查。
  • 您提到的辅助函数的实现在stackoverflow.com/a/22298304/859646中可用
【解决方案2】:

IsVisible 属性仅在节点已被隐藏或未如您所见时才返回。查找节点是否在屏幕上的唯一方法是按照建议使用 GetDisplayRect,然后针对树视图的客户端矩形对其进行测试。

但是,如果我理解您要正确执行的操作,VirtualTreeView 的 SelectionOption 中的 toCenterScrollIntoView 选项将为您提供所需的行为,而无需测试节点是否在可见区域中。

即(C++):

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

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2012-10-12
    • 2015-02-21
    相关资源
    最近更新 更多