TreeView:Change Plus Minus图标

Sha*_*bal 3 c# treeview tree visual-studio-2010 winforms

如何使用C#.NetTreeView ControlPlus Minus图标更改为其他图标.

小智 9

当你想自定义您的TreeView控件,微软提供了一个名为财产TreeViewDrawMode上的TreeView控件,它的价值是具有3个值的枚举:Normal,OwnerDrawText,OwnerDrawAll,在你的情况,你必须使用OwnerDrawAll.

将该属性设置为TreeViewDrawMode.OwnerDrawAll,当TreeView的节点显示时,DrawNode将触发一个名为的事件,因此您可以在那里处理您的绘图.当你自己绘制它时,通常需要绘制3个东西:展开/折叠图标,节点图标,节点文本.

我的样本如下:

//define the icon file path
string minusPath = Application.StartupPath + Path.DirectorySeparatorChar + "minus.png";
string plusPath = Application.StartupPath + Path.DirectorySeparatorChar + "plus.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));
}
Run Code Online (Sandbox Code Playgroud)

我测试的结果