如何以编程方式滚动 TTreeView?

How to scroll a TTreeView programmatically?

一个。创建一个 Delphi VCL Forms 应用程序。

乙。在窗体上放置一个 TTreeView,命名为 tvTest 并用项目填充它并设置 Treeview 的大小,以便滚动条在 TreeView 上可见,例如:

C。在窗体上放置一个按钮,并在其点击处理程序中写入以下代码:

  procedure TForm1.btnScrollClick(Sender: TObject);
  begin
    tvTest.ScrollBy(tvTest.Width, 0);
  end;

D.现在 运行 程序并单击按钮。假设水平滚动条应该从左向右滚动。但是没有任何反应。为什么?

那么如何让滚动条(当然还有内容的滚动条)从左到右、从右到左、向下或向上滚动?

Delphi 10.1 柏林更新 2
Windows 7 x64 SP1

编辑:当我使用这段代码时(类似于萨米的建议):

tvTest.ScrollBy(-3, -3);

...我得到了这件现代艺术作品:

要滚动 TreeView,请发送(或 PerformWM_VSCROLL and/or WM_HSCROLL 条消息。

tvTest.Perform(WM_HSCROLL, MakeWParam(SB_LINERIGHT, 0), 0);

tvTest.Perform(WM_VSCROLL, MakeWParam(SB_LINEDOWN, 0), 0);

参数见消息对应文档

ScrollBy 是 VCL 对 ScrollWindow API 的包装器,它移动控件的内容。这是绘制滚动控件的客户端部分的快捷方式,应该额外绘制显示的(空)部分。它通常由控件的内部实现使用。不是你要找的。