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