2009-03-19 7 views
3

J'ai une liste d'images d'environ 30 images, et 3 images que j'aimerais pouvoir superposer au-dessus des 30 quand un TreeNode est dans un état particulier. Je sais que C++ TreeItem peut le faire avec le TVIS_OVERLAYMASK comme tel:TreeNode Image Overlay

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

est-il un mécanisme pour obtenir des résultats similaires dans .NET?

Répondre

0

Je ne connais pas un moyen de faire la superposition automatiquement, mais vous pouvez le faire avec un nœud d'arbre dessiné par le propriétaire.

7

Je vois que cette question est toujours en train de recevoir des vues, donc je posterai l'implémentation de ce que David a suggéré.

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

Dans mon .NET 2.0 application les superpositions sont au-dessus de l'icône treeview. Utilisez-vous une version plus récente du framework? –

+0

mon mauvais: J'avais DrawMode être OwnerDrawAll pas OwnerDrawText semble bien fonctionner maintenant - merci –

+0

C'est dommage, après un peu plus de tests, je trouve que j'ai l'expérience de surlignage noir bizarre comme décrit ici: http://stackoverflow.com/q/ 1003459/417721 - nous sommes .net 3.5 –

1

Pourquoi ne génèrent pas simplement l'image avec la superposition sur la demande même, de sorte que vous ne perdiez pas de cycles CPU précieux comme celui-ci: http://madprops.org/blog/highlighting-treenodes-with-an-overlay-image/:

private void InitializeLinkedTreeImages() 
{ 
    foreach (string key in treeImages.Images.Keys) 
    { 
     Bitmap bmp = new Bitmap(treeImages.Images[key]); 
     Graphics g = Graphics.FromImage(bmp); 
     g.DrawImageUnscaled(Properties.Resources.Linked16, 0, 0); 
     treeImages.Images.Add(key + "Linked", bmp); 
    } 
}