4

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

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

4

1 回答 1

5

亲爱的迪迪埃(我的同义词),

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

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

  1. 设置Font.SizeTVirtualStringTree 的Header

    VirtualStringTree1.Header.Font.Size := UpDown1.Position;
    
  2. 设置Font.SizeTVirtualStringTree 节点的:

    VirtualStringTree1.Font.Size := UpDown1.Position;
    
  3. 设置HeightTVirtualStringTree 的Header

    VirtualStringTree1.Header.Height := Round(VirtualStringTree1.Header.Height * Delta);
    
  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);
    

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

  Sender.NodeHeight[Node] := Round(Extent * 1.1);

toAutoChangeScaleC.在 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;
于 2016-03-27T10:18:37.177 回答