Monday, February 21, 2011

TreeNode Image Overlay

I have an imagelist of about 30 images, and 3 images I'd like to be able to overlay on top of the 30 when a TreeNode is in a particular state. I know that a C++ TreeItem can do this with the TVIS_OVERLAYMASK as such:

SetItemState(hItem,INDEXTOOVERLAYMASK(nOverlayIndex), TVIS_OVERLAYMASK);

Is there any mechanism to achieve similar results in .NET?

From stackoverflow
  • I don't know of a way to do the overlay automatically, but you could do this with an owner drawn tree node.

  • I see this question is still getting views, so I'll post the implementation of what David suggested.

    internal class MyTree : TreeView
    {
        internal MyTree() :
            base()
        {
            // let the tree know that we're going to be doing some owner drawing
            this.DrawMode = TreeViewDrawMode.OwnerDrawText;
            this.DrawNode += new DrawTreeNodeEventHandler(MyTree_DrawNode);
        }
    
        void MyTree_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
            // Do your own logic to determine what overlay image you want to use
            Image overlayImage = GetOverlayImage();
    
            // you have to move the X value left a bit, 
            // otherwise it will draw over your node text
            // I'm also adjusting to move the overlay down a bit
            e.Graphics.DrawImage(overlayImage,
                e.Node.Bounds.X - 15, e.Node.Bounds.Y + 4);
    
            // We're done! Draw the rest of the node normally
            e.DefaultDraw = true
        }
    }
    

0 comments:

Post a Comment