C# 树节点图像叠加

C# 树节点图像叠加,c#,treeview,treenode,C#,Treeview,Treenode,我有一个大约30幅图像的图像列表,当树节点处于特定状态时,我希望能够在30幅图像的顶部覆盖3幅图像。我知道C++ TeeItIt可以用TVistOrLayS罩这样做: SetItemState(hItem,INDEXTOOVERLAYMASK(nOverlayIndex), TVIS_OVERLAYMASK); 在.NET中是否有任何机制可以实现类似的结果?我不知道自动进行覆盖的方法,但您可以使用所有者绘制的树节点来实现这一点。我看到这个问题仍在获取视图,因此我将发布David建议的实现 in

我有一个大约30幅图像的图像列表,当树节点处于特定状态时,我希望能够在30幅图像的顶部覆盖3幅图像。我知道C++ TeeItIt可以用TVistOrLayS罩这样做:

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

在.NET中是否有任何机制可以实现类似的结果?

我不知道自动进行覆盖的方法,但您可以使用所有者绘制的树节点来实现这一点。

我看到这个问题仍在获取视图,因此我将发布David建议的实现

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
    }
}

为什么不直接使用按需覆盖生成图像,这样就不必像这样浪费宝贵的CPU周期: :


在我的.NET 2.0应用程序中,覆盖层位于treeview图标的顶部。你使用的是新版本的框架吗?我的缺点是:我拥有DrawMode Drawall而不是OwnerDrawText现在似乎工作得很好-谢谢这是一个遗憾,经过一点测试后,我发现我遇到了奇怪的黑色突出显示,如这里所述:-我们是.net 3.5
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); 
    } 
}