delphiiconsoverlayvirtualtreeviewtvirtualstringtree

How best to render an overlay icon on top of basic Delphi TVirtualTreeView node icon


I'm converting a tree view from the standard TTreeView to use TVirtualStringTree. My final challenge is to implement a feature where I need to draw a 'pass/fail' status indicator on top of the known node icon. With TTreeView I used:

  var
   R : TRect;
  begin
    R := Node.DisplayRect( True );
    StatusIconList.Draw( TreeView1.Canvas,
                         R.Left - StatusIconList.Width - 14,
                         R.Top,
                         3 {MyOverlayImageIndex} );

The result is the red cross over the basic icon as shown below:

enter image description here

With TVirtualStringTree I hoped to find either a better way, or to get better known positions for the required overlay icon position. I'm doing:

   procedure DrawFailed;
    var
     R : TRect;
    begin
      R := CellRect;
      StatusIconList.Draw( TargetCanvas,
                           R.Left - StatusIconList.Width + 49 + Sender.GetNodeLevel( Node ) * 16,
                           R.Top,
                           siiFailed );
    end;

Is this the best solution? Is there a better way of getting the top/left corner of the basic icon without the horrible node level call?


Solution

  • You get Kind: TVTImageKind parameter in your OnGetImageIndex event handler. Check it for ikOverlay and simply return the appropriate image index.