178 lines
5.6 KiB
C#
178 lines
5.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
using System.Windows.Forms;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.ComponentModel;
|
|
|
|
namespace CPM
|
|
{
|
|
public class LV_BUTTON : Button
|
|
{
|
|
//Fields
|
|
private int borderSize = 0;
|
|
private int borderRadius = 0;
|
|
private Color borderColor = Color.PaleVioletRed;
|
|
private Color hoverColor = Color.LightBlue;
|
|
private Color clickColor = Color.DarkBlue;
|
|
|
|
[Category("Levelcode")]
|
|
public Color HoverColor
|
|
{
|
|
get { return hoverColor; }
|
|
set { hoverColor = value; }
|
|
}
|
|
|
|
[Category("Levelcode")]
|
|
public Color ClickColor
|
|
{
|
|
get { return clickColor; }
|
|
set { clickColor = value; }
|
|
}
|
|
//Properties
|
|
[Category("Levelcode")]
|
|
public int BorderSize
|
|
{
|
|
get { return borderSize; }
|
|
set
|
|
{
|
|
borderSize = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("Levelcode")]
|
|
public int BorderRadius
|
|
{
|
|
get { return borderRadius; }
|
|
set
|
|
{
|
|
borderRadius = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("Levelcode")]
|
|
public Color BorderColor
|
|
{
|
|
get { return borderColor; }
|
|
set
|
|
{
|
|
borderColor = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("Levelcode")]
|
|
public Color BackgroundColor
|
|
{
|
|
get { return this.BackColor; }
|
|
set { this.BackColor = value; }
|
|
}
|
|
|
|
[Category("Levelcode")]
|
|
public Color TextColor
|
|
{
|
|
get { return this.ForeColor; }
|
|
set { this.ForeColor = value; }
|
|
}
|
|
|
|
//Constructor
|
|
public LV_BUTTON()
|
|
{
|
|
this.FlatStyle = FlatStyle.Flat;
|
|
this.FlatAppearance.BorderSize = 0;
|
|
this.Size = new Size(150, 40);
|
|
this.BackColor = Color.MediumSlateBlue;
|
|
this.ForeColor = Color.White;
|
|
this.Resize += new EventHandler(Button_Resize);
|
|
this.MouseEnter += (s, e) => this.BackColor = hoverColor;
|
|
this.MouseLeave += (s, e) => this.BackColor = BackgroundColor;
|
|
this.MouseDown += (s, e) => this.BackColor = clickColor;
|
|
this.MouseUp += (s, e) => this.BackColor = hoverColor;
|
|
}
|
|
|
|
//Methods
|
|
private GraphicsPath GetFigurePath(Rectangle rect, int radius)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
float curveSize = radius * 2F;
|
|
|
|
path.StartFigure();
|
|
path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90);
|
|
path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90);
|
|
path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90);
|
|
path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90);
|
|
path.CloseFigure();
|
|
return path;
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs pevent)
|
|
{
|
|
base.OnPaint(pevent);
|
|
|
|
|
|
Rectangle rectSurface = this.ClientRectangle;
|
|
Rectangle rectBorder = Rectangle.Inflate(rectSurface, -borderSize, -borderSize);
|
|
int smoothSize = 2;
|
|
if (borderSize > 0)
|
|
smoothSize = borderSize;
|
|
|
|
if (borderRadius > 2) //Rounded button
|
|
{
|
|
using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius))
|
|
using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius - borderSize))
|
|
using (Pen penSurface = new Pen(this.Parent.BackColor, smoothSize))
|
|
using (Pen penBorder = new Pen(borderColor, borderSize))
|
|
{
|
|
pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
|
//Button surface
|
|
this.Region = new Region(pathSurface);
|
|
//Draw surface border for HD result
|
|
pevent.Graphics.DrawPath(penSurface, pathSurface);
|
|
|
|
//Button border
|
|
if (borderSize >= 1)
|
|
//Draw control border
|
|
pevent.Graphics.DrawPath(penBorder, pathBorder);
|
|
}
|
|
}
|
|
else //Normal button
|
|
{
|
|
pevent.Graphics.SmoothingMode = SmoothingMode.None;
|
|
//Button surface
|
|
this.Region = new Region(rectSurface);
|
|
//Button border
|
|
if (borderSize >= 1)
|
|
{
|
|
using (Pen penBorder = new Pen(borderColor, borderSize))
|
|
{
|
|
penBorder.Alignment = PenAlignment.Inset;
|
|
pevent.Graphics.DrawRectangle(penBorder, 0, 0, this.Width - 1, this.Height - 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
protected override void OnHandleCreated(EventArgs e)
|
|
{
|
|
base.OnHandleCreated(e);
|
|
this.Parent.BackColorChanged += new EventHandler(Container_BackColorChanged);
|
|
}
|
|
|
|
private void Container_BackColorChanged(object sender, EventArgs e)
|
|
{
|
|
this.Invalidate();
|
|
}
|
|
private void Button_Resize(object sender, EventArgs e)
|
|
{
|
|
if (borderRadius > this.Height)
|
|
borderRadius = this.Height;
|
|
}
|
|
}
|
|
|
|
}
|