mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
138 lines
4.0 KiB
C#
138 lines
4.0 KiB
C#
using System.Drawing.Drawing2D;
|
|
|
|
namespace GHelper.UI
|
|
{
|
|
public class RButton : Button
|
|
{
|
|
|
|
//Fields
|
|
private int borderSize = 5;
|
|
|
|
private int borderRadius = 5;
|
|
public int BorderRadius
|
|
{
|
|
get { return borderRadius; }
|
|
set
|
|
{
|
|
borderRadius = value;
|
|
}
|
|
}
|
|
|
|
private Color borderColor = Color.Transparent;
|
|
public Color BorderColor
|
|
{
|
|
get { return borderColor; }
|
|
set
|
|
{
|
|
borderColor = value;
|
|
}
|
|
}
|
|
|
|
|
|
private bool activated = false;
|
|
public bool Activated
|
|
{
|
|
get { return activated; }
|
|
set
|
|
{
|
|
if (activated != value)
|
|
Invalidate();
|
|
activated = value;
|
|
|
|
}
|
|
}
|
|
|
|
private bool secondary = false;
|
|
public bool Secondary
|
|
{
|
|
get { return secondary; }
|
|
set
|
|
{
|
|
secondary = value;
|
|
}
|
|
}
|
|
|
|
private bool badge = false;
|
|
public bool Badge
|
|
{
|
|
get { return badge; }
|
|
set
|
|
{
|
|
badge = value;
|
|
}
|
|
}
|
|
|
|
public RButton()
|
|
{
|
|
DoubleBuffered = true;
|
|
FlatStyle = FlatStyle.Flat;
|
|
FlatAppearance.BorderSize = 0;
|
|
}
|
|
|
|
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);
|
|
|
|
float ratio = pevent.Graphics.DpiX / 192.0f;
|
|
int border = (int)(ratio * borderSize);
|
|
|
|
Rectangle rectSurface = ClientRectangle;
|
|
Rectangle rectBorder = Rectangle.Inflate(rectSurface, -border, -border);
|
|
|
|
Color borderDrawColor = activated ? borderColor : Color.Transparent;
|
|
|
|
using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius + border))
|
|
using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius))
|
|
using (Pen penSurface = new Pen(Parent.BackColor, border))
|
|
using (Pen penBorder = new Pen(borderDrawColor, border))
|
|
{
|
|
penBorder.Alignment = PenAlignment.Outset;
|
|
pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
|
Region = new Region(pathSurface);
|
|
pevent.Graphics.DrawPath(penSurface, pathSurface);
|
|
pevent.Graphics.DrawPath(penBorder, pathBorder);
|
|
}
|
|
|
|
if (badge)
|
|
{
|
|
using (Brush brush = new SolidBrush(borderColor))
|
|
{
|
|
var radius = ratio * 10;
|
|
pevent.Graphics.FillEllipse(brush, rectSurface.Width - rectSurface.Height / 2 - radius, rectSurface.Height / 2 - radius, radius + radius, radius + radius);
|
|
}
|
|
}
|
|
|
|
if (!Enabled && ForeColor != SystemColors.ControlText)
|
|
{
|
|
var rect = pevent.ClipRectangle;
|
|
if (Image is not null)
|
|
{
|
|
rect.Y += Image.Height;
|
|
rect.Height -= Image.Height;
|
|
}
|
|
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
|
|
TextRenderer.DrawText(pevent.Graphics, Text, Font, rect, Color.Gray, flags);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|
|
}
|