如何设置TreeView控件的背景图像? (VS 2008 / .Net 3.5 / C#/ WinForms)

时间:2010-07-31 11:27:29

标签: c# winforms .net-3.5 treeview

我一直在做一些研究,这似乎是不可能的,除非我开始深入研究InterOperabilty,即PInvoke以及哪些不是我的水壶鱼。我正在发布这个问题,因为我想知道是否有人设法做到了这一点?

我为我的所有图像使用.png,并让专业人士提供我的图像,因此我知道图像采用最合适的最合适格式。

标准树视图控件似乎不直接支持背景图像,这样也不允许将背景颜色设置为透明?有没有人对这两个有任何想法?

2 个答案:

答案 0 :(得分:3)

如果您愿意使用第三方库,请查看http://objectlistview.sourceforge.net/cs/index.html - 请注意它是GPL。在那里设置背景图像很容易。

答案 1 :(得分:3)

这可以通过重写WndProc()并捕获WM_ERASEBKGND消息来实现。下面显示的控件执行此操作。但是,您将快速找到Windows窗体TreeView类不执行此操作的原因。启用“平滑滚动”系统选项后,您将获得非常难看的工件。没有提到缺少节点文本透明度。不,没有解决方法,只有完全替换不依赖于本机Windows控件的控件才能解决此问题。这不是您通常应该考虑的事情,除非它来自非常信誉良好的组件供应商。

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTreeView : TreeView {
    private Image mImage;
    public Image Image {
        get { return mImage; }
        set { mImage = value; Invalidate(); }
    }
    protected override void OnAfterCollapse(TreeViewEventArgs e) {
        if (mImage != null) Invalidate();
        base.OnAfterCollapse(e);
    }
    protected override void OnAfterExpand(TreeViewEventArgs e) {
        if (mImage != null) Invalidate();
        base.OnAfterExpand(e);
    }
    protected override void WndProc(ref Message m) {
        base.WndProc(ref m);
        if (m.Msg == 0x14 && mImage != null) {
            using (var gr = Graphics.FromHdc(m.WParam)) {
                gr.DrawImage(mImage, Point.Empty);
            }
        }
    }
}