5

我在 Delphi 7 中使用 SoftGem 的 VirtualStringTree。

有没有办法启用完整的网格线(就像在 TListView 中一样)?我只能找到toShowHorzGridLines,它只显示当前节点的线条,而不是下面空白处的任何东西,并且toShowVertGridLines,它只显示垂直线。

在添加项目之前,如何在空白处显示它们?

4

1 回答 1

5

我认为没有一种简单的方法可以在不修改PaintTree方法的情况下实现这一点,因为没有一个节点事件不能被触发,因为应该绘制线条的节点根本不存在。

这是一种如何根据最低可见节点额外绘制水平线的肮脏方式。实际上,它DefaultNodeHeight在此屏幕截图中以橙色填充的区域中的值的距离绘制线条:

在此处输入图像描述

这是代码:

type
  TVirtualStringTree = class(VirtualTrees.TVirtualStringTree)
  public
    procedure PaintTree(TargetCanvas: TCanvas; Window: TRect; Target: TPoint;
      PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); override;
  end;

implementation

{ TVirtualStringTree }

procedure TVirtualStringTree.PaintTree(TargetCanvas: TCanvas; Window: TRect;
  Target: TPoint; PaintOptions: TVTInternalPaintOptions;
  PixelFormat: TPixelFormat);
var
  I: Integer;
  EmptyRect: TRect;
  PaintInfo: TVTPaintInfo;
begin
  inherited;
  if (poGridLines in PaintOptions) and (toShowHorzGridLines in TreeOptions.PaintOptions) and
    (GetLastVisible <> nil) then
  begin
    EmptyRect := GetDisplayRect(GetLastVisible,
      Header.Columns[Header.Columns.GetLastVisibleColumn].Index, False);
    EmptyRect := Rect(ClientRect.Left, EmptyRect.Bottom + DefaultNodeHeight,
      EmptyRect.Right, ClientRect.Bottom);
    ZeroMemory(@PaintInfo, SizeOf(PaintInfo));
    PaintInfo.Canvas := TargetCanvas;
    for I := 0 to ((EmptyRect.Bottom - EmptyRect.Top) div DefaultNodeHeight) do
    begin
      PaintInfo.Canvas.Font.Color := Colors.GridLineColor;
      DrawDottedHLine(PaintInfo, EmptyRect.Left, EmptyRect.Right,
        EmptyRect.Top + (I * DefaultNodeHeight));
    end;
  end;
end;

这里是具有恒定和可变节点高度的结果:

在此处输入图像描述

上面屏幕截图中可见的故障(从左侧移动的线)只是虚线渲染的结果。如果您将LineStyle虚拟树视图上的属性设置为,lsSolid您将看到正确的结果。

于 2012-06-25T11:35:39.527 回答