树节点图像叠加

发布于 2024-07-15 12:25:20 字数 282 浏览 14 评论 0原文

我有一个大约 30 个图像的图像列表,当 TreeNode 处于特定状态时,我希望能够将 3 个图像叠加在 30 个图像的顶部。 我知道 C++ TreeItem 可以使用 TVIS_OVERLAYMASK 来做到这一点:

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

Is there anymechanism to receivelike results in .NET?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

许仙没带伞 2024-07-22 12:25:20

我发现这个问题仍然有很多人关注,所以我将发布大卫建议的实施情况。

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

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
    }
}
九厘米的零° 2024-07-22 12:25:20

为什么不直接按需生成带有叠加层的图像,这样就不必像这样浪费宝贵的 CPU 周期:
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); 
    } 
} 

Why don't you just generate the image with the overlay on demand even, so you don't have to waste precious CPU cycles like this:
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); 
    } 
} 
得不到的就毁灭 2024-07-22 12:25:20

我不知道如何自动进行覆盖,但您可以使用所有者绘制的树节点来完成此操作。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文