123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using System.Drawing.Drawing2D;
- namespace PaintDotNet.CustomControl
- {
- /// <summary>
- /// 自定义的双滑块的拖动条
- /// </summary>
- public partial class DoubleSlidingTrackbar : BaseUserControl
- {
- /// <summary>
- /// 控件长度
- /// </summary>
- private int length = 0;
- /// <summary>
- /// 绘制左侧滑动块的点集合
- /// </summary>
- private List<Point> LeftPoints = new List<Point>();
- /// <summary>
- /// 绘制右侧滑动块的点集合
- /// </summary>
- private List<Point> RightPoints = new List<Point>();
- /// <summary>
- /// 鼠标按下状态
- /// </summary>
- private bool isPress = false;
- /// <summary>
- /// 鼠标按下时选中的滑块 1左 2右
- /// </summary>
- private int choise = -1;
- /// <summary>
- /// X轴的位移初始位置
- /// </summary>
- private int oldX = -1;
- /// <summary>
- /// 最大值
- /// </summary>
- public decimal maxValue = 0;
- /// <summary>
- /// 响应事件
- /// </summary>
- //private bool responseEvent = true;
- /// <summary>
- /// 左侧滑块拖动事件
- /// </summary>
- public event EventHandler LeftHandlerDrag;
- private void OnLeftHandlerDrag()
- {
- if (LeftHandlerDrag != null)
- {
- LeftHandlerDrag(this, new EventArgs());
- }
- }
- /// <summary>
- /// 右侧滑块拖动事件
- /// </summary>
- public EventHandler RightHandlerDrag;
- private void OnRightHandlerDrag()
- {
- if (RightHandlerDrag != null)
- {
- RightHandlerDrag(this, new EventArgs());
- }
- }
- /// <summary>
- /// 控件长度
- /// </summary>
- /// <param name="length"></param>
- public DoubleSlidingTrackbar(int length = 220)
- {
- SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true);
- this.length = length;
- InitializeComponent();
- this.Width = this.length;
- LeftPoints.Add(new Point(10, 5));
- LeftPoints.Add(new Point(16, 5));
- LeftPoints.Add(new Point(16, 20));
- LeftPoints.Add(new Point(10, 15));
- RightPoints.Add(new Point(16, 5));
- RightPoints.Add(new Point(22, 5));
- RightPoints.Add(new Point(22, 15));
- RightPoints.Add(new Point(16, 20));
- this.Paint += new PaintEventHandler(this.DoubleSlidingTrackbar_Paint);
- this.MouseDown += new MouseEventHandler(this.DoubleSlidingTrackbar_MouseDown);
- this.MouseMove += new MouseEventHandler(this.DoubleSlidingTrackbar_MouseMove);
- this.MouseUp += new MouseEventHandler(this.DoubleSlidingTrackbar_MouseUp);
- }
- private void DoubleSlidingTrackbar_MouseDown(object sender, MouseEventArgs e)
- {
- GraphicsPath leftPath = new GraphicsPath();
- leftPath.AddPolygon(LeftPoints.ToArray());
- Region leftRegion = new Region(leftPath);
- GraphicsPath rightPath = new GraphicsPath();
- rightPath.AddPolygon(RightPoints.ToArray());
- Region rightRegion = new Region(rightPath);
- if (leftRegion.IsVisible(new Point(e.X, e.Y)))
- {
- choise = 1;
- isPress = true;
- oldX = e.X;
- }
- if (rightRegion.IsVisible(new Point(e.X, e.Y)))
- {
- choise = 2;
- isPress = true;
- oldX = e.X;
- }
- }
- private void DoubleSlidingTrackbar_MouseMove(object sender, MouseEventArgs e)
- {
- if (isPress)
- {
- switch (choise)
- {
- //左
- case 1:
- //if(e.X <= RightPoints[0].X)//e.X >= 10 &&
- {
- /*if(this.LeftPoints[1].X + e.X - oldX <= this.RightPoints[0].X
- && this.LeftPoints[0].X + e.X - oldX >= 10)
- {
- for (int i = 0; i < this.LeftPoints.Count; i++)
- {
- Point point = this.LeftPoints[i];
- point.X += e.X - oldX;
- if (point.X < 10)
- break;
- else
- this.LeftPoints[i] = point;
- }
- }*/
- if (this.LeftPoints[0].X + e.X - oldX >= 10)
- {
- if (this.LeftPoints[1].X + e.X - oldX <= this.RightPoints[0].X)
- {
- for (int i = 0; i < this.LeftPoints.Count; i++)
- {
- Point point = this.LeftPoints[i];
- point.X += e.X - oldX;
- if (point.X < 10)
- {
- break;
- }
- else
- {
- this.LeftPoints[i] = point;
- }
- }
- }
- else
- {
- LeftPoints.Clear();
- LeftPoints.Add(new Point(RightPoints[0].X - 6, 5));
- LeftPoints.Add(new Point(RightPoints[0].X, 5));
- LeftPoints.Add(new Point(RightPoints[0].X, 20));
- LeftPoints.Add(new Point(RightPoints[0].X - 6, 15));
- }
- OnLeftHandlerDrag();
- }
- }
- break;
- //右
- case 2:
- //if (e.X > LeftPoints[1].X)//e.X <= 210 &&
- {
- /*if (this.RightPoints[1].X + e.X - oldX <= 210
- && this.RightPoints[0].X + e.X - oldX>= LeftPoints[1].X)
- {
- for (int i = 0; i < this.RightPoints.Count; i++)
- {
- Point point = this.RightPoints[i];
- point.X += e.X - oldX;
- if (point.X > 210)
- break;
- else
- this.RightPoints[i] = point;
- }
- }*/
- if (this.RightPoints[1].X + e.X - oldX <= this.length - 10)
- {
- if (this.RightPoints[0].X + e.X - oldX >= LeftPoints[1].X)
- {
- for (int i = 0; i < this.RightPoints.Count; i++)
- {
- Point point = this.RightPoints[i];
- point.X += e.X - oldX;
- if (point.X > 210)
- {
- break;
- }
- else
- {
- this.RightPoints[i] = point;
- }
- }
- }
- else
- {
- RightPoints.Clear();
- RightPoints.Add(new Point(LeftPoints[1].X, 5));
- RightPoints.Add(new Point(LeftPoints[1].X + 6, 5));
- RightPoints.Add(new Point(LeftPoints[1].X + 6, 15));
- RightPoints.Add(new Point(LeftPoints[1].X, 20));
- }
- OnRightHandlerDrag();
- }
- }
- break;
- }
- oldX = e.X;
- this.Refresh();
- }
- }
- private void DoubleSlidingTrackbar_MouseUp(object sender, MouseEventArgs e)
- {
- oldX = -1;
- isPress = false;
- }
- private void DoubleSlidingTrackbar_Paint(object sender, PaintEventArgs e)
- {
- //绘制横线
- e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(214,214,214)), new Rectangle(16, 9, this.length - 32, 3));
- //绘制第一个滑块
- e.Graphics.FillPolygon(new SolidBrush(Color.FromArgb(0, 120, 215)), this.LeftPoints.ToArray());
- //e.Graphics.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(10, 5, 6, 10));
- //绘制第二个滑块
- e.Graphics.FillPolygon(new SolidBrush(Color.FromArgb(36, 171, 242)), this.RightPoints.ToArray());
- //e.Graphics.FillRectangle(new SolidBrush(Color.Yellow), new Rectangle(16, 5, 6, 10));
- }
- public double GetLeftSliderValue()
- {
- decimal unitLenght = this.maxValue / (this.length - 32);
- return (double)((LeftPoints[1].X-16) * unitLenght);
- }
- public double GetRightSliderValue()
- {
- decimal unitLenght = this.maxValue / (this.length - 32);
- return (double)((RightPoints[0].X - 16) * unitLenght);
- }
- public void SetLeftSliderPos(double left)
- {
- if (!isPress)
- {
- decimal unitLenght = (this.length - 32) / this.maxValue;
- int pos = (int)(left * (double)unitLenght);
- LeftPoints.Clear();
- LeftPoints.Add(new Point(10 + pos, 5));
- LeftPoints.Add(new Point(16 + pos, 5));
- LeftPoints.Add(new Point(16 + pos, 20));
- LeftPoints.Add(new Point(10 + pos, 15));
- this.Refresh();
- }
- }
- public void SetRightSliderPos(double right)
- {
- if(!isPress)
- {
- decimal unitLenght = (this.length - 32) / this.maxValue;
- int pos = (int)(right * (double)unitLenght);
- RightPoints.Clear();
- RightPoints.Add(new Point(16+pos, 5));
- RightPoints.Add(new Point(22+pos, 5));
- RightPoints.Add(new Point(22+pos, 15));
- RightPoints.Add(new Point(16+pos, 20));
- this.Refresh();
- }
- }
- public void InitLeftRightPoints()
- {
- LeftPoints.Clear();
- LeftPoints.Add(new Point(10, 5));
- LeftPoints.Add(new Point(16, 5));
- LeftPoints.Add(new Point(16, 20));
- LeftPoints.Add(new Point(10, 15));
- RightPoints.Clear();
- RightPoints.Add(new Point(16, 5));
- RightPoints.Add(new Point(22, 5));
- RightPoints.Add(new Point(22, 15));
- RightPoints.Add(new Point(16, 20));
- this.Refresh();
- }
- }
- }
|