2014-07-20 3 views
0

일부 그래픽을 노드 이미지로 그릴 필요가 있습니다. Like는 OnGetImageIndex 이벤트의 ImageList에서 이미지를 가져 오지만 TIcon, TImage, TBitmap과 같은 단일 소스에서 가져옵니다.TVirtualStringTree 트리에 노드 자신의 이미지/아이콘을 그립니다.

제 경우에는 모든 노드에 UserData 레코드에 고유 한 아이콘과 위치가 있습니다.

어떻게 아이콘을 노드에 그릴 수 있습니까? 내가 여기에이 코드를 발견하고, 내 상황을 숙달하려고

은 : 그 이유는 enter image description here

가 발생합니다 버튼 클릭 후

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 문제를 해결할 수 있습니까?

내가 뭘 잘못 했니?

+0

왜 그런가? 왜냐하면 나무는 당신이 그 일을하고 있다는 것을 모르고 이미지를위한 공간을 만들기 위해 노드 텍스트를 들여 쓰지 않기 때문입니다. – TLama

+0

알림 방법? 아니면 다른 생각이 있습니까? – AlexLL

+0

이 컴포넌트를 사용하여 어떤 expirience도 가지지 않았기 때문에 나는 단지 추측하고 있습니다. 하지만 대신 오히려 OnBeforeItemPaint 이벤트를 사용해서는 안됩니다. 그 이벤트를 사용하면 텍스트의 위치를 ​​제어하여 인컴의 위치와 같은 위치에 그려지 지 않을 수 있습니다. 그렇지 않으면 텍스트를 여러 공백으로 바꿀 수 있습니다. 그래서 오른쪽으로 이동합니다. OnAfterItemPaint 이벤트에서이 작업은 이벤트가 발생했을 때 텍스트가 이미 그려져 있기 때문에 작동하지 않습니다. – SilverWarior

답변

0

불행히도 VT는 별도 이미지 사용을 허용하지 않는 이미지 목록에 의존합니다. 동시에 이미지 목록은 항목 삽입 및 삭제와 관련하여 불편합니다. 대안 옵션으로 각 이미지에 대한 이미지 목록을 만들고 OnGetImageEx 이벤트 핸들러를 통해 VT로 반환 할 수 있습니다.

또는 VT가 이미지의 크기를 알고 AfterPaint에서 사용자 지정 이미지를 그릴 수 있도록 하나의 빈 투명 이미지로 하나의 더미 이미지 목록을 만들 수 있습니다.

관련 문제