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 { /// /// 自定义的双滑块的拖动条 /// public partial class DoubleSlidingTrackbar : BaseUserControl { /// /// 控件长度 /// private int length = 0; /// /// 绘制左侧滑动块的点集合 /// private List LeftPoints = new List(); /// /// 绘制右侧滑动块的点集合 /// private List RightPoints = new List(); /// /// 鼠标按下状态 /// private bool isPress = false; /// /// 鼠标按下时选中的滑块 1左 2右 /// private int choise = -1; /// /// X轴的位移初始位置 /// private int oldX = -1; /// /// 最大值 /// public decimal maxValue = 0; /// /// 响应事件 /// //private bool responseEvent = true; /// /// 左侧滑块拖动事件 /// public event EventHandler LeftHandlerDrag; private void OnLeftHandlerDrag() { if (LeftHandlerDrag != null) { LeftHandlerDrag(this, new EventArgs()); } } /// /// 右侧滑块拖动事件 /// public EventHandler RightHandlerDrag; private void OnRightHandlerDrag() { if (RightHandlerDrag != null) { RightHandlerDrag(this, new EventArgs()); } } /// /// 控件长度 /// /// 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(); } } }