일부 그래픽을 노드 이미지로 그릴 필요가 있습니다. Like는 OnGetImageIndex 이벤트의 ImageList에서 이미지를 가져 오지만 TIcon, TImage, TBitmap과 같은 단일 소스에서 가져옵니다.TVirtualStringTree 트리에 노드 자신의 이미지/아이콘을 그립니다.
제 경우에는 모든 노드에 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 픽셀.
어디서 텍스트의 drawing 문제를 해결할 수 있습니까?
내가 뭘 잘못 했니?
왜 그런가? 왜냐하면 나무는 당신이 그 일을하고 있다는 것을 모르고 이미지를위한 공간을 만들기 위해 노드 텍스트를 들여 쓰지 않기 때문입니다. – TLama
알림 방법? 아니면 다른 생각이 있습니까? – AlexLL
이 컴포넌트를 사용하여 어떤 expirience도 가지지 않았기 때문에 나는 단지 추측하고 있습니다. 하지만 대신 오히려 OnBeforeItemPaint 이벤트를 사용해서는 안됩니다. 그 이벤트를 사용하면 텍스트의 위치를 제어하여 인컴의 위치와 같은 위치에 그려지 지 않을 수 있습니다. 그렇지 않으면 텍스트를 여러 공백으로 바꿀 수 있습니다. 그래서 오른쪽으로 이동합니다. OnAfterItemPaint 이벤트에서이 작업은 이벤트가 발생했을 때 텍스트가 이미 그려져 있기 때문에 작동하지 않습니다. – SilverWarior