Hi @FMMM , Welcome to Microsoft Q&A.
I tried to simplify your code to see if it works.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace WindowsFormsControlLibrary3
{
public partial class MyButton : Button
{
private int borderSize = 0;
private int borderRadius = 0;
private Color borderColor = Color.PaleVioletRed;
private Color backgroundColor = Color.MediumSlateBlue;
private Color textColor = Color.White;
public int BorderSize
{
get { return borderSize; }
set
{
borderSize = value;
Invalidate();
}
}
public int BorderRadius
{
get { return borderRadius; }
set
{
borderRadius = value;
Invalidate();
}
}
public Color BorderColor
{
get { return borderColor; }
set
{
borderColor = value;
Invalidate();
}
}
public Color BackgroundColor
{
get { return backgroundColor; }
set
{
backgroundColor = value;
Invalidate();
}
}
public Color TextColor
{
get { return textColor; }
set
{
textColor = value;
Invalidate();
}
}
public MyButton()
{
FlatStyle = FlatStyle.Flat;
FlatAppearance.BorderSize = 0;
Size = new Size(150, 40);
BackColor = backgroundColor;
ForeColor = textColor;
Resize += Button_Resize;
}
private GraphicsPath GetFigurePath(Rectangle rect, int radius)
{
GraphicsPath path = new GraphicsPath();
if (radius == 0)
{
path.AddRectangle(rect);
}
else
{
int curveSize = radius * 2;
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);
var rectSurface = ClientRectangle;
var rectBorder = Rectangle.Inflate(rectSurface, -borderSize, -borderSize);
int smoothSize = Math.Min(borderSize, 2);
using (var pathSurface = GetFigurePath(rectSurface, borderRadius))
using (var pathBorder = GetFigurePath(rectBorder, borderRadius - borderSize))
using (var penSurface = new Pen(backgroundColor, smoothSize))
using (var penBorder = new Pen(borderColor, borderSize))
{
pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
Region = new Region(pathSurface);
pevent.Graphics.DrawPath(penSurface, pathSurface);
if (borderSize >= 1)
pevent.Graphics.DrawPath(penBorder, pathBorder);
}
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Parent.BackColorChanged += Container_BackColorChanged;
}
private void Container_BackColorChanged(object sender, EventArgs e)
{
Invalidate();
}
private void Button_Resize(object sender, EventArgs e)
{
if (borderRadius > Height)
borderRadius = Height;
}
}
}
Best Regards,
Jiale
If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.