CSkin博客

标题: 【C#TreeView控件】TreeView的扩展 [打印本页]

作者: DD2013    时间: 2015-1-5 13:24
标题: 【C#TreeView控件】TreeView的扩展
Treeview控件扩展
说明:
重写了treeview。还是和以前一样,先晒效果。(加了鼠标的跟随的效果,点击区域变大,节点的图标绘制)

效果图:


以下是控件源码:
[C#] 纯文本查看 复制代码
using System;
using System.Drawing;
using System.Windows.Forms;
using Windows.Resource;

namespace Windows.Forms.Controls
{

    public partial class TreeViewEx : TreeView
    {

        Color drawTextColor = Color.FromArgb(81, 81, 81);

        public TreeViewEx()
        {
            InitializeComponent();

            this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
            this.FullRowSelect = true;
            this.ItemHeight = 23;
            this.HotTracking = true;
            this.ShowLines = true;

        }

        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
        {
            base.OnDrawNode(e);

            //节点背景绘制
            if (e.Node.IsSelected)
            {
                e.Graphics.DrawImage(AssemblyHelper.GetImage("Resources.tree_Selected.png"), e.Bounds);
            }
            else if ((e.State & TreeNodeStates.Hot) != 0)//|| currentMouseMoveNode == e.Node)
            {
                e.Graphics.DrawImage(AssemblyHelper.GetImage("Resources.tree_Hover.png"), e.Bounds);
            }
            else
            {
                e.Graphics.FillRectangle(Brushes.White, e.Bounds);
            }

            //节点头图标绘制
            if (e.Node.IsExpanded)
            {
                e.Graphics.DrawImage(AssemblyHelper.GetImage("Resources.tree_NodeExpend.png"), e.Node.Bounds.X - 12, e.Node.Bounds.Y + 6);
            }
            else if (e.Node.IsExpanded == false && e.Node.Nodes.Count > 0)
            {
                e.Graphics.DrawImage(AssemblyHelper.GetImage("Resources.tree_NodeCollaps.png"), e.Node.Bounds.X - 12, e.Node.Bounds.Y + 6);
            }

            //文本绘制
            using (Font foreFont = new Font(this.Font, FontStyle.Regular))
            using (Brush drawTextBrush = new SolidBrush(drawTextColor))
            {
                e.Graphics.DrawString(e.Node.Text, foreFont, drawTextBrush, e.Node.Bounds.Left + 5, e.Node.Bounds.Top + 5);
            }
        }

        protected override void OnMouseDoubleClick(MouseEventArgs e)
        {
            base.OnMouseDoubleClick(e);
            TreeNode tn = this.GetNodeAt(e.Location);
            //调整【点击测试区域】大小,包括图标
            Rectangle bounds = new Rectangle(tn.Bounds.Left - 12, tn.Bounds.Y, tn.Bounds.Width - 5, tn.Bounds.Height);
            if (tn != null && bounds.Contains(e.Location) == false)
            {
                if (tn.IsExpanded == false)
                    tn.Expand();
                else
                    tn.Collapse();
            }
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            base.OnMouseClick(e);
            TreeNode tn = this.GetNodeAt(e.Location);
            this.SelectedNode = tn;
        }

        TreeNode currentNode = null;
        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            TreeNode tn = this.GetNodeAt(e.Location);
            Graphics g = this.CreateGraphics();
            if (currentNode != tn)
            {
                //绘制当前节点的hover背景
                if (tn != null)
                    OnDrawNode(new DrawTreeNodeEventArgs(g, tn, new Rectangle(0, tn.Bounds.Y, this.Width, tn.Bounds.Height), TreeNodeStates.Hot));

                //取消之前hover的节点背景
                if (currentNode != null)
                    OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));
            }
            currentNode = tn;
            g.Dispose();
        }


        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            //移出控件时取消Hover背景
            if (currentNode != null)
            {
                Graphics g = this.CreateGraphics();
                OnDrawNode(new DrawTreeNodeEventArgs(g, currentNode, new Rectangle(0, currentNode.Bounds.Y, this.Width, currentNode.Bounds.Height), TreeNodeStates.Default));
            }
        }
    }
}



作者: Blue_Pen    时间: 2015-1-5 14:11
本帖最后由 Blue_Pen 于 2015-1-5 14:12 编辑

注意排版规范,下次按照这种排版发帖,最好附上源码案例
作者: DD2013    时间: 2015-1-5 14:55
OK,好的。
作者: DD2013    时间: 2015-1-5 14:56
Blue_Pen 发表于 2015-1-5 14:11
注意排版规范,下次按照这种排版发帖,最好附上源码案例

ok,知道了
作者: 乔克斯    时间: 2015-1-5 16:59
快上传源码案例~康忙~康忙
作者: DD2013    时间: 2015-1-6 11:03
乔克斯 发表于 2015-1-5 16:59
快上传源码案例~康忙~康忙

在搞日期控件,我看了论坛的一片文章,日历是个窗体,这样不方便。自己做的,先上效果,暂时未美化。

   日期控件类型                                                                        日期窗体类型

作者: 乔克斯    时间: 2015-1-6 11:39
DD2013 发表于 2015-1-6 11:03
在搞日期控件,我看了论坛的一片文章,日历是个窗体,这样不方便。自己做的,先上效果,暂时未美化。

   ...

还不错,重绘日历控件,做好后分享哦。
作者: sa110011sa    时间: 2015-1-6 14:04
效果很赞哦!
作者: work_liufei    时间: 2015-1-6 21:11
刚好需要这个东西  真的很值
作者: work_liufei    时间: 2015-1-6 21:12
感觉无比强大
作者: jeanary    时间: 2015-1-6 23:48
很强大,感谢分享
作者: xiaohu_mail    时间: 2015-1-13 11:37
这个控件我也一直在用,但是一直有一个问题解决不了,就是鼠标只要一动它就会重新画,之前画过的也会再画,数据太多的时候会报错,崩溃,不知道大家有没有什么好的解决方案呢
作者: mumupudding    时间: 2015-1-16 08:51
不错值得学习
作者: 乔克斯    时间: 2015-1-21 14:22
xiaohu_mail 发表于 2015-1-13 11:37
这个控件我也一直在用,但是一直有一个问题解决不了,就是鼠标只要一动它就会重新画,之前画过的也会再画, ...

你可以优化下,只重绘,鼠标划过的部分。
作者: Wushao    时间: 2015-1-22 15:18
十分感谢楼主分享
作者: SanitySun    时间: 2015-1-25 23:18
Hi,楼主,能否提供一下源码哈,缺少AssemblyHelper 这个帮助类,没法用哈。
作者: 孤独陶醉    时间: 2015-1-26 09:33
LZ 把你的图片文件发一下
作者: lu18021407687    时间: 2015-4-28 23:51
好想要源码案例
作者: 1715577326    时间: 2015-11-5 17:54
楼主。能不能发下源码?谢谢
作者: Brennan    时间: 2015-12-7 14:37
DD2013 发表于 2015-1-6 11:03
在搞日期控件,我看了论坛的一片文章,日历是个窗体,这样不方便。自己做的,先上效果,暂时未美化。

   ...

楼主快分享!
作者: yoli799480165    时间: 2015-12-21 10:51
不能上传个源码撒?树用的相对其它控件来说还是比较常用的,不知道为毛SkinTreeView没有效果。楼主能给个比较完整的实现Demo吗?
作者: mmlovenn1314    时间: 2016-3-4 11:35
辛苦了  感谢咯咯咯咯咯
作者: ykslxj123    时间: 2016-3-12 11:08
学习下,晚上自己的程序
作者: logo005    时间: 2016-5-2 14:22
我想收藏这个帖子哪里有收藏的
作者: 1715577326    时间: 2016-5-5 11:59
楼主有没有源码实例?求分享一份呗。谢谢
作者: wangcaiok    时间: 2017-4-4 23:21
加载treeview时,第一个node会有重影!!
作者: gts    时间: 2017-4-24 02:46
受益匪浅,非常感谢。
作者: gavin2016    时间: 2017-9-22 11:00
感谢分享,学习一下。
作者: DD2013    时间: 2017-11-24 15:27
1715577326 发表于 2016-5-5 11:59
楼主有没有源码实例?求分享一份呗。谢谢

已经线上使用了。
作者: maker316    时间: 2019-3-15 17:08
mark一下 以备不时之需
作者: 鹏飞千里13    时间: 2019-3-16 20:50
这个相当牛,膜拜
作者: 青衫    时间: 2019-10-18 16:03
大佬可以发下AssemblyHelper类给我看看吗
作者: ql_quincy    时间: 2020-1-8 00:22
123123123123123
作者: cyuehua0278    时间: 2020-5-13 08:44
非常感谢楼主,很厉害了!
作者: 岔路ko    时间: 2020-8-19 22:00
好评,快上传原始码案例〜康忙〜康忙




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2