我在 Delphi 7 中使用 SoftGem 的 VirtualStringTree。
有没有办法启用完整的网格线(就像在 TListView 中一样)?我只能找到toShowHorzGridLines
,它只显示当前节点的线条,而不是下面空白处的任何东西,并且toShowVertGridLines
,它只显示垂直线。
在添加项目之前,如何在空白处显示它们?
我在 Delphi 7 中使用 SoftGem 的 VirtualStringTree。
有没有办法启用完整的网格线(就像在 TListView 中一样)?我只能找到toShowHorzGridLines
,它只显示当前节点的线条,而不是下面空白处的任何东西,并且toShowVertGridLines
,它只显示垂直线。
在添加项目之前,如何在空白处显示它们?
我认为没有一种简单的方法可以在不修改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
您将看到正确的结果。