简体   繁体   English

如何更改我的treeView图标+, - 像c#.net win窗体中的Windows资源管理器树视图

[英]How to change my treeView icons insted of +,- like a windows explorer treeview in c#.net win forms

How can I change the expand/collapse images from the plus ( + ) and minus ( - ) images that appear when ShowPlusMinus and/or ShowRootLines are true . 如何在ShowPlusMinus和/或ShowRootLinestrue时显示的加号(+)和减号( - )图像中更改展开/折叠图像。

To help visualize, I would like to make the following TreeView 为了帮助可视化,我想制作以下TreeView treeview加/减+/-

Look like this (like Windows explorer) 看起来像这样(像Windows资源管理器)

树视图

When you want to customize your treeview control, Microsoft provides a property named "TreeViewDrawMode" on the treeview control, it's value is a enum which has 3 values:Normal, OwnerDrawText, OwnerDrawAll, in your situation, you must use OwnerDrawAll. 当您想要自定义树视图控件时,Microsoft在treeview控件上提供了一个名为“TreeViewDrawMode”的属性,它的值是一个包含3个值的枚举:Normal,OwnerDrawText,OwnerDrawAll,在您的情况下,您必须使用OwnerDrawAll。 after you set that property as OwnerDrawAll, when the treeview's nodes are showing, a event named "DrawNode" will be triggered, so you can process your drawing there. 将该属性设置为OwnerDrawAll后,当显示树视图的节点时,将触发名为“DrawNode”的事件,以便您可以在那里处理绘图。 when you draw it by yourself, usually you need to draw 3 things: expand/collapse icon, node icon, node text. 当你自己绘制它时,通常需要绘制3个东西:展开/折叠图标,节点图标,节点文本。 my sample is below: //define the icon file path string minusPath = Application.StartupPath + Path.DirectorySeparatorChar + "minus.png"; 我的示例如下://定义图标文件路径字符串minusPath = Application.StartupPath + Path.DirectorySeparatorChar +“minus.png”; string plusPath = Application.StartupPath + Path.DirectorySeparatorChar + "plus.png"; string plusPath = Application.StartupPath + Path.DirectorySeparatorChar +“plus.png”; string nodePath = Application.StartupPath + Path.DirectorySeparatorChar + "directory.png"; string nodePath = Application.StartupPath + Path.DirectorySeparatorChar +“directory.png”;

    public FrmTreeView()
    {
        InitializeComponent();
        //setting to customer draw
        this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
        this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
    }

    void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        Rectangle nodeRect = e.Node.Bounds;
        /*--------- 1. draw expand/collapse icon ---------*/
        Point ptExpand = new Point(nodeRect.Location.X - 20, nodeRect.Location.Y + 2);
        Image expandImg = null;
        if (e.Node.IsExpanded || e.Node.Nodes.Count < 1)
            expandImg = Image.FromFile(minusPath);
        else
            expandImg = Image.FromFile(plusPath);
        Graphics g = Graphics.FromImage(expandImg);
        IntPtr imgPtr = g.GetHdc();
        g.ReleaseHdc();
        e.Graphics.DrawImage(expandImg, ptExpand);

        /*--------- 2. draw node icon ---------*/
        Point ptNodeIcon = new Point(nodeRect.Location.X - 4, nodeRect.Location.Y + 2);
        Image nodeImg = Image.FromFile(nodePath);
        g = Graphics.FromImage(nodeImg);
        imgPtr = g.GetHdc();
        g.ReleaseHdc();
        e.Graphics.DrawImage(nodeImg, ptNodeIcon);
        /*--------- 3. draw node text ---------*/
        Font nodeFont = e.Node.NodeFont;
        if (nodeFont == null)
            nodeFont = ((TreeView)sender).Font;
        Brush textBrush = SystemBrushes.WindowText;
        //to highlight the text when selected
        if ((e.State & TreeNodeStates.Focused) != 0)
            textBrush = SystemBrushes.HotTrack;
        //Inflate to not be cut
        Rectangle textRect = nodeRect;
        //need to extend node rect
        textRect.Width += 40;
        e.Graphics.DrawString(e.Node.Text, nodeFont, textBrush, Rectangle.Inflate(textRect, -12, 0));
     }

the result of my test is like this: 我的测试结果是这样的: 结果图

Expanding on Ivan Ičin 's solution : 扩展IvanIčin的解决方案:

[DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
private static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList);

public static void SetTreeViewTheme(IntPtr treeHandle) {
     SetWindowTheme(treeHandle, "explorer", null);
}

To use, add a TreeView to your form, and in Form_Load : 要使用,请在表单和Form_Load添加TreeView

SetTreeViewTheme( treeView1.Handle );

Alternatively, you can extend the TreeView object 或者,您可以扩展TreeView对象

public class MyTreeView : TreeView
{

    [DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
    private static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList);

    public MyTreeView() {
        SetWindowTheme(this.Handle, "explorer", null);
    }
}

树视图之前和之后 Depicts what it looks like before and after calling SetWindowTheme 描述调用SetWindowTheme之前和之后的样子

There are 3 methods I can think of: 我能想到3种方法:

  1. Sunny already mentioned using SetWindowTheme(TreeView.Handle, "explorer", null) Sunny已经提到过使用SetWindowTheme(TreeView.Handle, "explorer", null)

  2. Using WPF if that is the option and adding TreeViewItem object 如果这是选项并添加TreeViewItem对象,则使用WPF

  3. Overriding OnPaint methods, which is too complicated, considering you can do just 1, so 1 or 2 it is up to you to chose. 重写OnPaint方法,这太复杂了,考虑到你只能做1,所以1或2由你决定。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM