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();
}
}
}