TVirtualStringTree在树中绘制节点自己的图像/图标

时间:2014-07-20 09:44:17

标签: delphi delphi-xe6 virtualtreeview tvirtualstringtree

我需要绘制一些图形作为节点图像。 就像它在OnGetImageIndex事件中从ImageList绘制图像一样,但是来自TIcon,TIm​​age,TBitmap等单一来源。

在我的情况下,所有节点都有自己的图标并放置在UserData记录中。

如何将theese图标绘制到节点?

我在这里找到了这段代码,并试图根据我的情况擅长:

procedure TForm10.Button1Click(Sender: TObject);
var
  Node: PVirtualNode;
begin
  VirtualStringTree1.AddChild(nil);
  Node := VirtualStringTree1.AddChild(nil);
  VirtualStringTree1.AddChild(Node);
  Node := VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
  VirtualStringTree1.AddChild(Node);
end;

procedure TForm10.VirtualStringTree1AfterItemPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
  rImage: TRect;
  OffsetLeft: Integer;
  Icon: TIcon;
begin
  rImage := ItemRect;
  Icon := TIcon.Create;
  Icon.LoadFromFile('TestIcon_16.ico');
  with TVirtualStringTree(Sender) do
  begin
    if (toShowRoot in TreeOptions.PaintOptions) then
      OffsetLeft := Indent * (GetNodeLevel(Node) + 1)
    else
      OffsetLeft := Indent * GetNodeLevel(Node);

    Inc(rImage.Left, Margin + OffsetLeft);
    Inc(rImage.Top, (NodeHeight[Node] - Icon.Height) div 2);
    rImage.Right := rImage.Left + Icon.Width;
    rImage.Bottom := rImage.Top + Icon.Height;
  end;
  DrawIcon(TargetCanvas.Handle, rImage.Left, rImage.Top, Icon.Handle);
end;

点击按钮后,我看到: enter image description here

为什么会这样? 图标大小100% - 16 x 16像素。

我可以在哪里解决文字的绘制问题?

我做错了什么?

1 个答案:

答案 0 :(得分:0)

不幸的是,VT依赖于不允许使用单独图像的图像列表。同时,只要涉及项目插入和删除,图像列表就不方便。因此,作为变通方法选项,您可以为每个图像创建图像列表,并通过OnGetImageEx事件处理程序将其返回到VT。

或者,您可以使用一个空的透明图像创建一个虚拟图像列表,以便VT知道图像具有的尺寸,并在AfterPaint中绘制您自己的自定义图像。