我需要绘制一些图形作为节点图像。 就像它在OnGetImageIndex事件中从ImageList绘制图像一样,但是来自TIcon,TImage,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;
点击按钮后,我看到:
为什么会这样? 图标大小100% - 16 x 16像素。
我可以在哪里解决文字的绘制问题?
我做错了什么?
答案 0 :(得分:0)
不幸的是,VT依赖于不允许使用单独图像的图像列表。同时,只要涉及项目插入和删除,图像列表就不方便。因此,作为变通方法选项,您可以为每个图像创建图像列表,并通过OnGetImageEx
事件处理程序将其返回到VT。
或者,您可以使用一个空的透明图像创建一个虚拟图像列表,以便VT知道图像具有的尺寸,并在AfterPaint中绘制您自己的自定义图像。