سلام به همه

مطابق با آموزش های شخص فرهیخته ای ، باتنی ساخته شده که خواص هم داره ، همین کلاس پایین
برنامه یکبار که اجرا می کنم در قسمتی از نوار ابزار کنترل RJButton اضافه میشه ، همه چی اوکی و خوب
هس اما بعضی وقتی ها که برنامه بسته میشه و دوباره برنامه رو باز می کنم
حتما باید یه فرمی که این کنترل داخل اون استفاده نشه اجرا کنم
دوباره دونه دونه تو فرم هایی که این کنترل هایی استفاده شده کلیک کنم
و داستان هایی از این قبیل ..
فکر می کنم راه بهینه تری برای حل این موضوع باید وجود داشته باشه


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 WindowsFormsApplication1
{
public class RJButton : Button
{
//Fields
private int borderSize = 0;
private int borderRadius = 0;
private Color borderColor = Color.PaleVioletRed;

//Properties
[Category("RJ Code Advance")]
public int BorderSize
{
get { return borderSize; }
set
{
borderSize = value;
this.Invalidate();
}
}

[Category("RJ Code Advance")]
public int BorderRadius
{
get { return borderRadius; }
set
{
borderRadius = value;
this.Invalidate();
}
}

[Category("RJ Code Advance")]
public Color BorderColor
{
get { return borderColor; }
set
{
borderColor = value;
this.Invalidate();
}
}

[Category("RJ Code Advance")]
public Color BackgroundColor
{
get { return this.BackColor; }
set { this.BackColor = value; }
}

[Category("RJ Code Advance")]
public Color TextColor
{
get { return this.ForeColor; }
set { this.ForeColor = value; }
}

//Constructor
public RJButton()
{
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);
}

//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;
}
}
}