放大 TVVirtualStringTree

Did*_*alé 4 delphi zooming virtualtreeview tvirtualstringtree

我想找到放大/缩小 TVirtualStringTree 的“最佳方式”。
“放大”是指模仿放大镜。
必须优先使用 TVirtualStringTree 控件中专门用于此的属性/方法来理解“最佳方式”。如果不存在任何方法,则提出最简单的方法,避免使用低级 API。

为了更好地解释这个问题,
以下是 TVirtualStringTree 初始状态的截图: 初始状态 http://didier.cabale.free.fr/temp/VST1.jpg
.. 这里是 TVirtualStringTree 处于通缉状态的截图: 通缉状态 http://didier.cabale.free.fr/temp/VST2.jpg

Did*_*alé 5

亲爱的迪迪埃(我的同人),

这是我所做的:
重要说明:这就是我所做的,但我不确定这是最佳解决方案,因此任何新想法都非常受欢迎!!

A. 在同一个事件处理程序中(例如 Edit 的 OnChange)。

  1. 设置Font.SizeTVirtualStringTree 的Header

    VirtualStringTree1.Header.Font.Size := UpDown1.Position;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置Font.SizeTVirtualStringTree 节点的:

    VirtualStringTree1.Font.Size := UpDown1.Position;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 设置HeightTVirtualStringTree 的Header

    VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 设置WidthTVirtualStringTree的列Header

    for i := 0 to VirtualStringTree1.Header.Columns.Count -1 do
      VirtualStringTree1.Header.Columns.Items[i].Width := Round(VirtualStringTree1.Header.Columns.Items[i].Width * Delta);
    
    Run Code Online (Sandbox Code Playgroud)

B. 在 TVirtualStringTree 的OnMeasureTextHeight事件处理程序上,设置其NodeHeight[Node]属性:

  Sender.NodeHeight[Node] := Round(Extent * 1.1);
Run Code Online (Sandbox Code Playgroud)

C.toAutoChangeScale在 Object Inspector中将 TVirtualStringTree 设置为 false。

全部放在一起,它给出:

procedure TForm1.Edit3Change(Sender: TObject);
var
  Delta: Double;
  i: byte;
begin
  Delta := UpDown1.Position / VirtualStringTree1.Font.Size;
  VirtualStringTree1.BeginUpdate();
  try
  VirtualStringTree1.Font.Size        := UpDown1.Position;
  VirtualStringTree1.Header.Font.Size := UpDown1.Position;
  VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
  for i := 0 to VirtualStringTree1.Header.Columns.Count -1 do
    VirtualStringTree1.Header.Columns.Items[i].Width := Round(VirtualStringTree1.Header.Columns.Items[i].Width * Delta);
  finally
    VirtualStringTree1.EndUpdate();
  end;
end;

procedure TForm1.VirtualStringTree1MeasureTextHeight(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  const Text: string; var Extent: Integer);
begin
  Sender.NodeHeight[Node] := Round(Extent * 1.1);
end;
Run Code Online (Sandbox Code Playgroud)