using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace treeview

{

    public partial class Form_TreeView : Form

    {

        int treeViewLocationY = 0;//定高变量

        int moveDistance = 0 , moveArea = 0; //移动参数

        int B_Height = 0 , H_Height = 0; //滑动条高度

        int one_Nodes = 0, two_Nodes = 0, three_Nodes = 0, four_Nodes = 0;//节点数

 

        bool mouse_Press = false; //鼠标按下

        bool mouse_Wheel = false; //滑轮是否滚动

 

        Point mouseOff; //存放当前鼠标位置

        Point treeViewLocation; //初始位置

        public Form_TreeView()

        {

            InitializeComponent();

 

            treeViewLocation = this.treeView.Location;

 

            B_Height = ScrollBar_panel.Height;

 

            ScrollHard_panel.Location = new Point(0, 0);

 

            Set_Scroll();

 

            //鼠标事件

            ScrollHard_panel.MouseWheel += new MouseEventHandler(OnMouseWheel);

            ScrollHard_panel.MouseDown += new MouseEventHandler(ScrollHard_panel_MouseDown);

            ScrollHard_panel.MouseUp += new MouseEventHandler(ScrollHard_panel_MouseUp);

            ScrollHard_panel.MouseMove += new MouseEventHandler(ScrollHard_panel_MouseMove);

            ScrollHard_panel.MouseLeave += ScrollHard_panel_MouseLeave;

 

            timer1.Start();

        }

 

        //鼠标按下

        private void ScrollHard_panel_MouseDown(object sender, MouseEventArgs e)

        {

            if (e.Button == MouseButtons.Left) //鼠标左键

            {

                treeViewLocationY = this.treeView.Location.Y;

                mouseOff.Y = e.Y;  //取当前位置

                mouse_Press = true; //鼠标按下

            }

        }

 

        //鼠标放开

        private void ScrollHard_panel_MouseUp(object sender, MouseEventArgs e)

        {

            mouse_Press = false; //鼠标放开

        }

 

        //鼠标离开范围

        private void ScrollHard_panel_MouseLeave(object sender, EventArgs e)

        {

            mouse_Wheel = false; //滑轮不可用

        }

          

        //鼠标移动事件

        private void ScrollHard_panel_MouseMove(object sender, MouseEventArgs e)

        {

            mouse_Wheel = true; //可以用滑轮

            if (mouse_Press) //鼠标按下状态

            {

                int set_y = ScrollHard_panel.Top + e.Y - mouseOff.Y;

                if (set_y < 0) { set_y = 0; } //超范围

                else if (set_y > moveArea) { set_y = moveArea; } //超范围

                else { ScrollHard_panel.Location = new Point(ScrollHard_panel.Location.X, set_y); } //滚动块的定位   

 

 

                float num = (e.Y - mouseOff.Y) / (float)moveArea * (treeView.Height - ScrollBar_panel.Height);

                 

                if (ScrollHard_panel.Location.Y <= 1)

                {

                    treeView.Location = treeViewLocation;

                }

                else if (ScrollHard_panel.Location.Y >= moveArea-1)

                {

                    treeView.Location = new Point(this.treeView.Location.X, -(treeView.Height - ScrollBar_panel.Height));

                }

                else 

                {

                    treeView.Location = new Point(treeView.Location.X, this.treeView.Location.Y - (int)num);

                }

            }

        }

 

        //定位TreeView

        private void TreeViewLocation()

        {

            if (ScrollHard_panel.Location.Y <= 1)

            {

                treeView.Location = treeViewLocation;

            }

            else if (ScrollHard_panel.Location.Y >= moveArea - 1)

            {

                treeView.Location = new Point(treeView.Location.X, -(treeView.Height - ScrollBar_panel.Height));

            }

            else

            {

                treeView.Location = new Point(treeView.Location.X, treeViewLocationY - moveDistance);

            }

        }

        //鼠标滑轮事件

        private void OnMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)

        {

            int set_y = 0;

 

            if (mouse_Wheel) //是否判断鼠标滑轮

            {

                if (e.Delta > 0) //滑轮向上

                {

                    set_y = ScrollHard_panel.Location.Y - 10; //每次移动10

                    if (set_y < 0) { set_y = 0; } //超范围

                }

                if (e.Delta < 0)  //滑轮向下

                {

                    set_y = ScrollHard_panel.Location.Y + 10; //每次移动10

                    if (set_y > moveArea) { set_y = moveArea; } //超范围

                }

                ScrollHard_panel.Location = new Point(0, set_y); //滚动块的定位

 

                moveDistance = (int)(set_y / (float)moveArea * (treeView.Height - ScrollBar_panel.Height));

 

                TreeViewLocation();

            }

        }

 

        private void top_btn_Click(object sender, EventArgs e)

        {

            int set_y = ScrollHard_panel.Location.Y - 10; //每次移动10

 

            if (set_y < 0) { set_y = 0; } //超范围

 

            ScrollHard_panel.Location = new Point(0, set_y); //滚动块的定位

 

            moveDistance = (int)(set_y / (float)moveArea * (treeView.Height - ScrollBar_panel.Height));

 

            TreeViewLocation();

        }

 

        private void down_btn_Click(object sender, EventArgs e)

        {

            int set_y = ScrollHard_panel.Location.Y + 10; //每次移动10

 

            if (set_y > moveArea) { set_y = moveArea; } //超范围

            ScrollHard_panel.Location = new Point(0, set_y); //滚动块的定位

 

            moveDistance = (int)(set_y / (float)moveArea * (treeView.Height - ScrollBar_panel.Height));

 

            TreeViewLocation();

        }

 

        //建立滚动控件

        private void Set_Scroll()

        {

            H_Height = B_Height * B_Height / GetNodesHeight();

 

            if (H_Height >= B_Height)

            {

                ScrollHard_panel.Visible = false;

                ScrollBar_panel.Visible = false;

            }

            else

            {

                ScrollHard_panel.Visible = true;

                ScrollBar_panel.Visible = true;

 

                ScrollHard_panel.Size = new Size(ScrollBar_panel.Width, H_Height);

            }

            moveArea = ScrollBar_panel.Height - ScrollHard_panel.Height;

        }

 

        //获取treeview动态高度

        private int GetNodesHeight()

        {

            one_Nodes = 0; two_Nodes = 0; three_Nodes = 0; four_Nodes = 0;  //归0

 

            one_Nodes = this.treeView.Nodes.Count;

 

            for (int i = 0; i < this.treeView.Nodes.Count; i++)

            {

                if (this.treeView.Nodes[i].IsExpanded)

                {

                    two_Nodes += this.treeView.Nodes[i].Nodes.Count;

 

                    for (int j = 0; j < this.treeView.Nodes[i].Nodes.Count; j++)

                    {

                        if (this.treeView.Nodes[i].Nodes[j].IsExpanded)

                        {

                            three_Nodes += this.treeView.Nodes[i].Nodes[j].Nodes.Count;

 

                            for (int k = 0; k < this.treeView.Nodes[i].Nodes[j].Nodes.Count; k++)

                            {

                                if (this.treeView.Nodes[i].Nodes[j].Nodes[k].IsExpanded)

                                {

                                    four_Nodes += this.treeView.Nodes[i].Nodes[j].Nodes[k].Nodes.Count;

                                }

                            }

                        }

                    }

                }

            }

 

            this.treeView.Height = (one_Nodes + two_Nodes + three_Nodes + four_Nodes) * 20; 

            return this.treeView.Height;

        }

 

        //展开节点

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)

        {

            Set_Scroll();

        }

 

        //折叠节点

        private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)

        {

            Set_Scroll();

        }

        private void timer1_Tick(object sender, EventArgs e)

        {

            label1.Text = (treeView.Height - ScrollBar_panel.Height).ToString() + "===" + GetNodesHeight().ToString();

            label2.Text = moveDistance.ToString();

            label3.Text = one_Nodes + "===" + two_Nodes + "===" + three_Nodes + "===" + four_Nodes;

        }

    }

posted on 2020-03-12 16:27  _萧朗  阅读(445)  评论(0编辑  收藏  举报