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 CircleControl : UserControl
{
public int _position = -1;
public List positionMap;
List BtnPens = new List();
private GraphicsPath graphicsPath = new GraphicsPath();
List BtnPaths = new List();
public CircleControl(int radius)
{
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true);
InitializeComponent();
Size = new Size(radius * 2 + 2, radius * 2 + 2);
Paint += new PaintEventHandler(Control_Paint);
MouseMove += new MouseEventHandler(Control_Move);
MouseDown += new MouseEventHandler(Control_MouseDown);
MouseUp += new MouseEventHandler(Control_MouseUp);
MouseLeave += CircleControl_Leave;
var smallRadius = (int)(radius * 1.1 / 2);
var location = radius - smallRadius;
double d = smallRadius * 2 * Math.Sin(22.5 * Math.PI / 180);
double x1 = (smallRadius * 2 - d * 2) / 2;
float d1 = (float)d;
float x2 = (float)x1;
for (int i = 0; i < 16; i++)
{
var path = new GraphicsPath();
var start = 157.5f + i * 45;
if (i < 8)
{
BtnPens.Add(new Pen(Color.Black, 1));
path.AddPie(location, location, smallRadius * 2, smallRadius * 2, start, 45f);
}
else
{
BtnPens.Add(new Pen(Color.Black, 1));
path.AddPie(0, 0, radius * 2, radius * 2, start, 45f);
}
BtnPaths.Add(path);
}
graphicsPath.AddEllipse(0, 0, radius * 2, radius * 2);
positionMap = new List();
positionMap.Add(new int[] { -1, 0 });
positionMap.Add(new int[] { -1, -1 });
positionMap.Add(new int[] { 0, -1 });
positionMap.Add(new int[] { 1, -1 });
positionMap.Add(new int[] { 1, 0 });
positionMap.Add(new int[] { 1, 1 });
positionMap.Add(new int[] { 0, 1 });
positionMap.Add(new int[] { -1, 1 });
}
private void CircleControl_Leave(object sender, EventArgs e)
{
InitPen();
Refresh();
}
public event EventHandler mouseUp;
public event EventHandler mouseDown;
private void Control_MouseDown(object sender, MouseEventArgs e)
{
mouseDown?.Invoke(this, e);
}
private void Control_MouseUp(object sender, MouseEventArgs e)
{
mouseUp?.Invoke(this, e);
}
private void Control_Move(object sender, MouseEventArgs e)
{
InitPen();
MoveEvent(e);
Refresh();
}
private void Control_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
var current = _position;
for (int i = 15; i > -1; i--)
{
if (i != current)
e.Graphics.DrawPath(BtnPens[i], BtnPaths[i]);
}
if (current > -1)
e.Graphics.DrawPath(BtnPens[current], BtnPaths[current]);
}
private void InitPen()
{
if (_position > -1)
{
BtnPens[_position] = new Pen(Color.Black, 1);
}
}
private void MoveEvent(MouseEventArgs e)
{
_position = -1;
for (int i = 0; i < 16; i++)
{
if (BtnPaths[i].IsVisible(e.Location))
{
BtnPens[i] = new Pen(Color.Blue, 2);
_position = i;
return;
}
}
}
}
}