【问题标题】:How to center position of specific TreeView node?如何将特定 TreeView 节点的位置居中?
【发布时间】:2013-08-29 06:08:37
【问题描述】:

当我用 TTreeView 打开表单时,我用一些数据填充它并选择一些节点。但是我需要使选定的节点在控件的中心可见(当然,如果可能的话)。我找不到如何使用标准 TTreeView 组件来做到这一点。 有什么想法吗?

【问题讨论】:

  • 不足以让您确保它被 MakeVisible 看到吗?你想要的需要自己计算滚动和滚动的距离。
  • @TLama - 我正在使用 Delphi XE3,当我选择节点时它变得可见,但它看起来不是很好,因为用户需要查看一些上下文(选定项目的下方和上方)。跨度>
  • 好吧,那么然后获取节点边界(DisplayRect(False)),计算它到要居中位置的距离并滚动控件。这是我能想到的唯一方法。
  • @TLama - 这似乎是我需要的(我在寻找解决方案时错过了 DisplayRect)。明天会检查它。谢谢!

标签: delphi treeview


【解决方案1】:

我能找到滚动 TreeView 的唯一方法是向其发送值为 SB_LINEDOWN/SB_LINEUPWM_VSCROLL。由于某种原因,控件似乎没有响应SB_THUMBPOSITION 的滚动值,例如富编辑。出于这个原因,下面的尝试通过向控件发送一堆行滚动消息来使节点或多或少居中。自己试试看是否适合您的需求。

var
  DR, CR: TRect;
  ScrollPx, ScrollLines, i: Integer;
begin
  if Assigned(TreeView1.Selected) then begin

    // calculate how many *pixels* should we scroll
    DR := TreeView1.Selected.DisplayRect(False);
    CR := TreeView1.ClientRect;
    ScrollPx := - Round((CR.Bottom / 2) - DR.Top - ((DR.Bottom - DR.Top) / 2));

    // how many lines does it correspond to
    ScrollLines := ScrollPx div TreeView_GetItemHeight(TreeView1.Handle);

    // scroll that many lines
    if ScrollLines > 0 then
      for i := 1 to ScrollLines do
        TreeView1.Perform(WM_VSCROLL, MakeWParam(SB_LINEDOWN, 0), 0)
    else if ScrollLines < 0 then
      for i := ScrollLines to -1 do
        TreeView1.Perform(WM_VSCROLL, MakeWParam(SB_LINEUP, 0), 0);
  end;

【讨论】:

  • 我仍然想知道是否有关于如何按像素滚动任何窗口控件(具有滚动条)的明确答案。我最多可以移动窗口的内容(通过ScrollWindowEx 函数),但它永远不会持久。当控件无效时,窗口内容移回,我从来没有发现如何相应地移动滚动条。也许我应该花更多的时间在这上面。 [+1]
  • @TLama - 我从来没有完全弄清楚ScrollWindow[Ex] 有什么用处。我一直认为它并没有真正滚动任何东西,但它是绘制您自己的滚动控件的偏移区域的快捷方式,绘制无效部分的负担仍然落在您身上。它不适用于现成的控件,因为它们一有机会就会绘制其原始外观。不过我可能错了。谢谢你的投票。 :)
  • 我无法让上面的代码在 Delphi 7 中编译。TreeView_GetItemHeight 未定义,TreeView1.GetItemHeight 也是如此。有什么建议吗,@SertacAkyuz?
  • @Tom - 在 uses 子句中包含“commctrl”。
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2020-09-02
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多