89 lines
4.1 KiB
C#
89 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace AGVControl
|
|
{
|
|
public partial class MyRadioButton : RadioButton
|
|
{
|
|
public int CheckWidth { get; set; } = 30;
|
|
public Color CheckOnColor { get; set; } = Color.OrangeRed;
|
|
public Color CheckOffColor { get; set; } = Color.DimGray;
|
|
public Color Bordercolor { get; set; } = Color.DimGray;
|
|
public int BorderSize { get; set; } = 2;
|
|
public int BorderRadius { get; set; } = 7;
|
|
public MyRadioButton()
|
|
{
|
|
InitializeComponent();
|
|
// Set Optimized Double Buffer to reduce flickering
|
|
this.SetStyle(ControlStyles.UserPaint, true);
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
|
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
|
|
|
// Redraw when resized
|
|
this.SetStyle(ControlStyles.ResizeRedraw, true);
|
|
|
|
this.Resize += arLabel_Resize;
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs pe)
|
|
{
|
|
pe.Graphics.InterpolationMode = InterpolationMode.High;
|
|
pe.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
|
pe.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|
|
|
pe.Graphics.Clear(this.BackColor);
|
|
|
|
var XPosition = this.DisplayRectangle.Left;
|
|
var YPosition = this.DisplayRectangle.Top;
|
|
using (GraphicsPath Path = new GraphicsPath())
|
|
{
|
|
Path.AddLine(XPosition + BorderRadius, YPosition, XPosition + Width - (BorderRadius * 2), YPosition);
|
|
Path.AddArc(XPosition + Width - (BorderRadius * 2), YPosition, BorderRadius * 2, BorderRadius * 2, 270, 90);
|
|
Path.AddLine(XPosition + Width, YPosition + BorderRadius, XPosition + Width, YPosition + Height - (BorderRadius * 2));
|
|
Path.AddArc(XPosition + Width - (BorderRadius * 2), YPosition + Height - (BorderRadius * 2), BorderRadius * 2, BorderRadius * 2, 0, 90);
|
|
Path.AddLine(XPosition + Width - (BorderRadius * 2), YPosition + Height, XPosition + BorderRadius, YPosition + Height);
|
|
Path.AddArc(XPosition, YPosition + Height - (BorderRadius * 2), BorderRadius * 2, BorderRadius * 2, 90, 90);
|
|
Path.AddLine(XPosition, YPosition + Height - (BorderRadius * 2), XPosition, YPosition + BorderRadius);
|
|
Path.AddArc(XPosition, YPosition, BorderRadius * 2, BorderRadius * 2, 180, 90);
|
|
Path.CloseFigure();
|
|
|
|
|
|
|
|
|
|
var r1 = new Rectangle(
|
|
DisplayRectangle.Left, DisplayRectangle.Top,
|
|
CheckWidth,
|
|
DisplayRectangle.Height - 1);
|
|
var r2 = new Rectangle(r1.Right + 3, r1.Top, DisplayRectangle.Width - r1.Width - 3 - Padding.Right, r1.Height);
|
|
var CC = Checked ? CheckOnColor : CheckOffColor;
|
|
pe.Graphics.FillRectangle(new SolidBrush(CC), r1);
|
|
StringFormat sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
|
|
if (this.TextAlign == ContentAlignment.MiddleLeft) sf.Alignment = StringAlignment.Near;
|
|
else if (this.TextAlign == ContentAlignment.MiddleRight) sf.Alignment = StringAlignment.Far;
|
|
pe.Graphics.DrawString(this.Text, this.Font, new SolidBrush(ForeColor), r2, sf);
|
|
//pe.Graphics.DrawRectangle(new Pen(this.Bordercolor, this.BorderSize), DisplayRectangle);
|
|
this.Region = new System.Drawing.Region(Path);
|
|
|
|
|
|
pe.Graphics.DrawPath(new Pen(this.Bordercolor, this.BorderSize), Path);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
void arLabel_Resize(object sender, EventArgs e)
|
|
{
|
|
Invalidate();
|
|
}
|
|
}
|
|
}
|