2009-03-19 4 views
3

У меня есть изображение около 30 изображений и 3 изображения, которые я хотел бы наложить поверх 30, когда TreeNode находится в определенном состоянии. Я знаю, что C++ TreeItem может сделать это с TVIS_OVERLAYMASK как таковой:Наложение изображения TreeNode

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

Есть ли какой-либо механизм для достижения аналогичных результатов в .NET?

ответ

0

Я не знаю, как сделать наложение автоматически, но вы можете сделать это с помощью дерева, нарисованного узлом дерева.

7

Я вижу, что этот вопрос по-прежнему получает мнения, поэтому я опубликую, как это сделал Дэвид.

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

В моей .NET 2.0, оверлеи находятся поверх значка дерева. Используете ли вы более новую версию фреймворка? –

+0

мой плохой: у меня был DrawMode, который будет OwnerDrawAll не OwnerDrawText, похоже, теперь хорошо работает - спасибо –

+0

Жаль, после небольшого тестирования я нахожу, что я испытываю странное черное выделение, как описано здесь: http://stackoverflow.com/q/ 1003459/417721 - we are .net 3.5 –

1

Почему вы не просто генерировать изображения с наложением по требованию даже, так что вам не придется тратить драгоценные циклы процессора, как это: 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); 
    } 
} 
Смежные вопросы