• 【WinForm-TreeView】实现Win7 Areo效果


    效果图:

    新建一个继承自TreeView的控件类,代码如下:

    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Runtime.InteropServices;
    
    namespace SenseTreeView
    {
        public class SenseTreeView : TreeView
        {
            #region 控件属性
    
            //显示字体
            private Font _NodeFont;
            public Font NodeFont
            {
                get
                {
                    return _NodeFont;
                }
                set
                {
                    _NodeFont = value;
                }
            }
    
            //选择TreeView TreeNode时的背景色
            private Brush _BackgrountBrush;
            public Brush BackgroundBrush
            {
                get
                {
                    return _BackgrountBrush;
                }
                set
                {
                    _BackgrountBrush = value;
                }
            }
    
            //选择TreeView TreeNode时背景色的边框画笔
            private Pen _BackgroundPen;
            public Pen BackgroundPen
            {
                get
                {
                    return _BackgroundPen;
                }
                set
                {
                    _BackgroundPen = value;
                }
            }
    
            //TreeView中TreeNode展开时的节点显示图标,
            private Image _NodeExpandedImage;
            public Image NodeExpandedImage
            {
                get
                {
                    return _NodeExpandedImage;
                }
                set
                {
                    _NodeExpandedImage = value;
                }
            }
            //TreeView中TreeNode合拢时的节点显示图标
            private Image _NodeCollapseImage;
            public Image NodeCollapseImage
            {
                get
                {
                    return _NodeCollapseImage;
                }
                set
                {
                    _NodeCollapseImage = value;
                }
            }
            //TreeView中TreeNode的节点显示图标的大小
            private Size _NodeImageSize;
            public Size NodeImageSize
            {
                get
                {
                    return _NodeImageSize;
                }
                set
                {
                    _NodeImageSize = value;
                }
            }
    
            //节点显示图标离左边界的位置
            private int _NodeOffset;
            public int NodeOffset
            {
                get
                {
                    return _NodeOffset;
                }
                set
                {
                    _NodeOffset = value;
                }
            }
    
            #endregion
    
            #region 构造函数
    
            public SenseTreeView()
            {
                //设置窗体Style
                //this.SetStyle(ControlStyles.UserPaint, true);               //支持用户重绘窗体
                //this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);    //在内存中先绘制界面
                //this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);   //双缓冲,防止绘制时抖动
                //this.SetStyle(ControlStyles.DoubleBuffer, true);            //双缓冲,防止绘制时抖动 
                //this.UpdateStyles();
    
                //不显示树形节点显示连接线
                this.ShowLines = false;
    
                //设置绘制TreeNode的模式
                this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
    
                //不显示TreeNode前的“+”和“-”按钮
                this.ShowPlusMinus = false;
    
                //不支持CheckedBox
                this.CheckBoxes = false;
    
                //设置TreeNode的行高
                SendMessage(this.Handle, TVM_SETITEMHEIGHT, 20, 0);
    
                //设置默认BackgroundBrush
                BackgroundBrush = new SolidBrush(Color.FromArgb(90, Color.FromArgb(205, 226, 252)));
    
                //设置默认BackgroundPen
                BackgroundPen = new Pen(Color.FromArgb(130, 249, 252), 1);
    
                //设置默认NodeFont
                NodeFont = new Font("宋体", 12, FontStyle.Regular);
    
                //设置默认节点显示图标及Size
                NodeExpandedImage = null;
                NodeCollapseImage = null;
                NodeImageSize = new Size(18, 18);
    
                //设置默认节点显示图标便宜位置
                NodeOffset = 5;
            }
    
            #endregion
    
            #region 节点绘制函数
    
            //绘制TreeView树中TreeNode
            protected override void OnDrawNode(DrawTreeNodeEventArgs e)
            {
                TreeNode tn = e.Node as TreeNode;
                if (tn == null)
                {
                    return;
                }
    
                //设置Image绘制Rectangle
                Point pt = new Point(tn.Bounds.X + NodeOffset, tn.Bounds.Y);
                Rectangle rt = new Rectangle(pt, NodeImageSize);
    
                if ((e.State & TreeNodeStates.Selected) != 0)
                {
                    //绘制TreeNode选择后的背景框
                    e.Graphics.FillRectangle(BackgroundBrush, 2, tn.Bounds.Y, this.Width - 7, tn.Bounds.Height - 1);
    
                    //绘制TreeNode选择后的边框线条
                    e.Graphics.DrawRectangle(BackgroundPen, 1, tn.Bounds.Y, this.Width - 6, tn.Bounds.Height - 1);                                
                }
    
                //绘制节点图片
                if (NodeExpandedImage != null && NodeCollapseImage != null)
                {
                    if (tn.Nodes.Count != 0)
                    {
                        if (tn.IsExpanded == true)
                        {
                            e.Graphics.DrawImage(NodeExpandedImage, rt);
                        }
                        else
                        {
                            e.Graphics.DrawImage(NodeCollapseImage, rt);
                        }
                    }
    
                    rt.X += 15;
                }
    
                //绘制节点自身图片                
                if (e.Node.SelectedImageIndex != -1 && this.ImageList != null)
                {
                    rt.X += 5;
                    e.Graphics.DrawImage(this.ImageList.Images[e.Node.SelectedImageIndex], rt);
                }
    
                //绘制节点的文本
                rt.X += 20;
                rt.Y += 1;
                rt.Width = this.Width - rt.X;
                e.Graphics.DrawString(e.Node.Text, NodeFont, Brushes.Black, rt);
            }
    
            #endregion
    
            #region 鼠标消息响应函数
    
            //响应鼠标按下消息
            protected override void OnMouseDown(MouseEventArgs e)
            {
                TreeNode clickedNode = this.GetNodeAt(e.X, e.Y);
    
                if (clickedNode != null && NodeBounds(clickedNode).Contains(e.X, e.Y))
                {
                    this.SelectedNode = clickedNode;                
                }
            }
    
            //响应鼠标双击消息
            protected override void OnMouseDoubleClick(MouseEventArgs e)
            {
                TreeNode clickedNode = this.GetNodeAt(e.X, e.Y);
    
                if (clickedNode != null && NodeBounds(clickedNode).Contains(e.X, e.Y))
                {
                    this.SelectedNode = clickedNode;
    
                    //判断节点的状态
                    if (clickedNode.Nodes.Count != 0)
                    {
                        if (clickedNode.IsExpanded)
                        {
                            clickedNode.Collapse();
                        }
                        else
                        {
                            clickedNode.Expand();
                        }
                    }
                }
            }
    
            #endregion
    
            #region 私有函数
    
            //返回TreeView中TreeNode的整行区域
            private Rectangle NodeBounds(TreeNode node)
            {
                // Set the return value to the normal node bounds.
                Rectangle bounds = node.Bounds;
    
                //if (node.Tag != null)
                //{
                //    // Retrieve a Graphics object from the TreeView handle
                //    // and use it to calculate the display width of the tag.
                //    Graphics g = this.CreateGraphics();
                //    int tagWidth = (int)g.MeasureString(node.Tag.ToString(), NodeFont).Width + 6;
    
                //    // Adjust the node bounds using the calculated value.
                //    bounds.Offset(tagWidth / 2, 0);
                //    bounds = Rectangle.Inflate(bounds, tagWidth / 2, 0);
                //    g.Dispose();
                //}
    
                bounds.Width = this.Width;
    
                return bounds;
            }
    
            #endregion
    
            #region 引用函数
    
            const int TV_FRIST = 0x1100;
            const int TVM_SETITEMHEIGHT = TV_FRIST + 27;
    
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern IntPtr SendMessage(IntPtr hWnd, int nMsg, int wParam, int Param);
    
            #endregion
        }
    }

    在窗体里应用:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using SenseTreeView.Properties;
    
    namespace SenseTreeView
    {
        public partial class Form1 : Form
        {
            private SenseTreeView stv;
    
            public Form1()
            {
                InitializeComponent();
    
                // Create and initialize the TreeView control.
                stv = new SenseTreeView();
                stv.Dock = DockStyle.Left;
                stv.BackColor = Color.White;
                //stv.CheckBoxes = true;
                stv.Width = 250;
    
                ImageList imagelist = new ImageList();
                imagelist.Images.Add(Resources._1264);
                imagelist.Images.Add(Resources._1265);
                imagelist.Images.Add(Resources._1268);
                stv.ImageList = imagelist;
    
                stv.NodeExpandedImage = Resources.UnSelect;
                stv.NodeCollapseImage = Resources.IsSelect;
    
                // Add nodes to the TreeView control.            
                for (int x = 1; x < 4; ++x)
                {
                    // Add a root node to the TreeView control.                
                    TreeNode node = new TreeNode("中华人民共和国");
                    node.SelectedImageIndex = 0;
                    for (int y = 1; y < 4; ++y)
                    {
                        // Add a child node to the root node.
                        TreeNode tn = new TreeNode("Subtask");
                        tn.SelectedImageIndex = 2;
                        node.Nodes.Add(tn);
                    }
                    stv.Nodes.Add(node);
                }
                stv.ExpandAll();
    
                // Initialize the form and add the TreeView control to it.            
                this.Controls.Add(stv);
            }
        }
    }
  • 相关阅读:
    关于VSCode如何缩进两个空格
    基于vue来开发一个仿饿了么的外卖商城(二)
    在复杂的项目开发中使用结对编程
    第一个博客
    docker容器启动失败解决办法
    windows转mac-开发环境搭建(六):mac上搭建git环境
    windows转mac-开发环境搭建(五):mac上用docker安装并运行mysql
    windows转mac-开发环境搭建(四):mac上搭建node、VS code、idea环境
    windows转mac-开发环境搭建(三):mac上搭建maven环境
    windows转mac-开发环境搭建(二):mac上搭建java环境
  • 原文地址:https://www.cnblogs.com/Sukie-s-home/p/6741912.html
Copyright © 2020-2023  润新知