本文在继承自带的Panel的基础上,进行了一点拓展,实现了panel背景的渐变填充以及边框的圆角设置。
效果如下:
属性栏:
实现原理也很简单:
在onpaint事件内进行重绘,首先进行渐变的填充,用LinearGradientBrush 渐变颜色的笔刷,填充整个空间,再绘制出圆角区域就行了。
代码附上:
///
/// 渐变背景颜色panel
///
[ToolboxBitmap(typeof(System.Windows.Forms.Panel))]
[Description("拓展 Panel 可实现背景渐变颜色 边框圆角")]
public partial class yPanelGradual : Panel
{
#region 变量定义
private Color startColor = Color.Lime; // 渐变填充起始色
private Color endColor = Color.Blue; // 渐变填充结束颜色
private float angle = 45f;// 渐变填充绘制角度
private Color borderColor = Color.Black;//边框颜色
private int borderSize = 2;//边框粗细
private int radious = 40; // 边框圆角大小
#endregion
#region 构造函数
///
/// 渐变填充 边框设置的panel
///
public yPanelGradual()
{
InitializeComponent();
}
#endregion
#region 自定属性
///
/// 渐变填充起始颜色
///
[Category("1、自定属性"), Description("渐变填充起始颜色")]
public Color StartColor
{
get
{
return startColor;
}
set
{
startColor = value;
this.Invalidate();
}
}
///
/// 渐变填充结束颜色
///
[Category("1、自定属性"), Description("渐变填充结束颜色")]
public Color EndColor
{
get
{
return endColor;
}
set
{
endColor = value;
this.Invalidate();
}
}
///
/// 渐变填充角度
///
[Category("1、自定属性"), Description("渐变填充角度")]
public float Angle
{
get
{
return angle;
}
set
{
angle = value;
this.Invalidate();
}
}
///
/// 隐藏之前的BackColor
///
[Browsable(false)]
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
}
}
///
/// 边框颜色
///
[Category("1、自定属性"), Description("边框颜色")]
public Color BorderColor
{
get
{
return borderColor;
}
set
{
borderColor = value;
this.Invalidate();
}
}
///
/// 边框粗细(1-3)
///
[Category("1、自定属性"), Description("边框粗细(1-3)")]
public int BorderSize
{
get
{
return borderSize;
}
set
{
if (value < 1) value = 1;
if (value > 3) value = 3;
borderSize = value;
this.Invalidate();
}
}
///
/// 圆角弧度 1-90 ; 控制着控件的最小大小
///
[Category("1、自定属性"), Description("圆角弧度,1-90;控制着控件的最小大小")]
public int Radious
{
get
{
return radious;
}
set
{
if (value < 1) value = 1;
if (value > 90) value = 90;
radious = value;
// 设置最小大小 使其不会出现圆角交叉的现象
this.MinimumSize = new Size(radious, radious);
this.Invalidate();
}
}
///
/// 内部字体
///
[Category("1、自定属性"), Description("内部字体")]
public override Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
}
}
///
/// 内部字体颜色
///
[Category("1、自定属性"), Description("内部字体颜色")]
public override Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}
#endregion
#region 事件重写
///
///
///
///
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
LinearGradientBrush linearBrush = new LinearGradientBrush(ClientRectangle, startColor, endColor, angle);
e.Graphics.FillRectangle(linearBrush, ClientRectangle);
RectangleF rectBorder = new RectangleF(0.5F, 0.5F, this.Width - 1.5F, this.Height - 1.5F);
using (GraphicsPath pathSurface = GetFigurePath(rectBorder, radious))
using (Pen penBorder = new Pen(borderColor, borderSize))
{
this.Region = new Region(pathSurface);
e.Graphics.DrawPath(penBorder, pathSurface);
}
}
///
/// 获取带圆角的边框
///
///
///
///
private GraphicsPath GetFigurePath(RectangleF rect, float radious)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
path.AddArc(rect.X, rect.Y, radious, radious, 180, 90);
path.AddArc(rect.Width - radious, rect.Y, radious, radious, 270, 90);
path.AddArc(rect.Width - radious, rect.Height - radious, radious, radious, 0, 90);
path.AddArc(rect.X, rect.Height - radious, radious, radious, 90, 90);
path.CloseFigure();
return path;
}
#endregion
}