Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TreeView : Change Plus Minus icon [closed]

How do i change the Plus Minus icon of TreeView Control to some other icon using C#.Net.

like image 787
Shahid Iqbal Avatar asked Dec 26 '22 17:12

Shahid Iqbal


1 Answers

When you want to customize your TreeView control, Microsoft provides a property named TreeViewDrawMode on the TreeView control, its value is an enum which has 3 values: Normal, OwnerDrawText, OwnerDrawAll, in your situation, you must use OwnerDrawAll.

After you set that property to TreeViewDrawMode.OwnerDrawAll, when the TreeView's nodes are showing, an event named DrawNode will be triggered, so you can process your drawing there. When you draw it by yourself, usually you need to draw 3 things: expand/collapse icon, node icon, node text.

My sample is below:

//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));
}

the result of my test

like image 173
Scott Yang Avatar answered Dec 28 '22 06:12

Scott Yang