1

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

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

我如何将这些图标绘制到节点上?

我在这里找到了这段代码,并试图适应我的情况:

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;

单击按钮后,我看到: 在此处输入图像描述

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

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

我做错了什么?

4

1 回答 1

0

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

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

于 2014-11-05T14:49:00.467 回答