using System;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Windows.Forms;
|
|
namespace WinCustControls
|
{
|
public partial class UPanel : Panel
|
{
|
public UPanel()
|
{
|
InitializeComponent();
|
SetStyle(ControlStyles.Selectable, true);
|
SetStyle(ControlStyles.AllPaintingInWmPaint, true);//忽略窗口消息,减少闪烁
|
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//绘制到缓冲区,减少闪烁
|
SetStyle(ControlStyles.UserPaint, true);//控件由其自身而不是操作系统绘制
|
SetStyle(ControlStyles.ResizeRedraw, true);//控件调整其大小时重绘
|
SetStyle(ControlStyles.SupportsTransparentBackColor, true);//支持透明背景
|
r = this.ClientRectangle;
|
}
|
|
private Color bgColor = Color.LightGray;
|
/// <summary>
|
/// 背景色1 (渐变颜色1)
|
/// </summary>
|
[DefaultValue(typeof(Color), "LightGray"), Description("控件的背景色1")]
|
public Color BgColor
|
{
|
get { return bgColor; }
|
set
|
{
|
bgColor = value;
|
//Refresh();//立即重绘
|
Invalidate();//引发重绘,不会立即执行
|
}
|
}
|
|
private Color bgColor2 = Color.Transparent;
|
/// <summary>
|
/// 背景色2 (渐变颜色2)
|
/// </summary>
|
[DefaultValue(typeof(Color), "Transparent"), Description("控件的背景色2")]
|
public Color BgColor2
|
{
|
get { return bgColor2; }
|
set
|
{
|
bgColor2 = value;
|
Invalidate();
|
}
|
}
|
|
private Color borderColor = Color.Gray;
|
/// <summary>
|
/// 边框颜色
|
/// </summary>
|
[DefaultValue(typeof(Color), "Gray"), Description("控件的边框颜色")]
|
public Color BorderColor
|
{
|
get { return borderColor; }
|
set
|
{
|
borderColor = value;
|
Invalidate();
|
}
|
}
|
|
private int borderWidth = 0;
|
/// <summary>
|
/// 边框粗细
|
/// </summary>
|
[DefaultValue(typeof(int), "0"), Description("控件的边框粗细")]
|
public int BorderWidth
|
{
|
get { return borderWidth; }
|
set
|
{
|
borderWidth = value;
|
Invalidate();
|
}
|
}
|
|
private int radius = 5;
|
/// <summary>
|
/// 边框圆角半径
|
/// </summary>
|
[DefaultValue(typeof(int), "5"), Description("控件的边框圆角半径")]
|
public int Radius
|
{
|
get { return radius; }
|
set
|
{
|
radius = value;
|
Invalidate();
|
}
|
}
|
|
private LinearGradientMode gradientMode = LinearGradientMode.Vertical;
|
/// <summary>
|
/// 边框圆角半径
|
/// </summary>
|
[DefaultValue(typeof(LinearGradientMode), "Vertical"), Description("控件的背景渐变模式")]
|
public LinearGradientMode GradientMode
|
{
|
get { return gradientMode; }
|
set
|
{
|
gradientMode = value;
|
Invalidate();
|
}
|
}
|
|
Rectangle r;//绘制区域
|
protected override void OnSizeChanged(EventArgs e)
|
{
|
base.OnSizeChanged(e);
|
r = this.ClientRectangle;
|
this.Region = new Region(r);
|
r.Width -= 1;
|
r.Height -= 1;
|
|
}
|
|
/// <summary>
|
/// 重写绘制
|
/// </summary>
|
/// <param name="e"></param>
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
base.OnPaint(e);
|
//绘制工作 边框 背景
|
Graphics g = e.Graphics;//绘图对象
|
//呈现质量--高质量呈现
|
g.SmoothingMode = SmoothingMode.AntiAlias;
|
GraphicsPath path1 = new GraphicsPath();//边框的圆角矩形
|
GraphicsPath path2 = new GraphicsPath();//背景部分圆角矩形
|
Rectangle rect;//内部填充的矩形
|
if (radius > 0)
|
{
|
//生成外部矩形的圆角矩形路径
|
path1 = PaintClass.GetRoundRectangle(r, radius);
|
if (borderWidth > 0)
|
{
|
g.FillPath(new SolidBrush(borderColor), path1);//填充边框矩形
|
//定义内部矩形结构
|
rect = new Rectangle(r.X + borderWidth, r.Y + borderWidth, r.Width - 2 * borderWidth, r.Height - 2 * borderWidth);
|
//生成内部矩形的圆角矩形路径
|
path2 = PaintClass.GetRoundRectangle(rect, radius - 1);
|
}
|
else
|
{
|
path2 = path1;
|
rect = r;
|
}
|
//背景色填充
|
if (bgColor2 != Color.Transparent)
|
{
|
//渐变画刷
|
LinearGradientBrush bgBrush = new LinearGradientBrush(rect, bgColor, bgColor2, gradientMode);
|
g.FillPath(bgBrush, path2);//填充背景
|
}
|
else
|
{
|
Brush b = new SolidBrush(bgColor);
|
g.FillPath(b, path2);
|
}
|
}
|
else
|
{
|
if (borderWidth > 0)
|
{
|
g.FillRectangle(new SolidBrush(borderColor), r);//填充边框矩形
|
//定义内部矩形结构
|
rect = new Rectangle(r.X + borderWidth, r.Y + borderWidth, r.Width - 2 * borderWidth, r.Height - 2 * borderWidth);
|
}
|
else
|
{
|
rect = r;
|
}
|
//背景色填充
|
if (bgColor2 != Color.Transparent)
|
{
|
//渐变画刷
|
LinearGradientBrush bgBrush = new LinearGradientBrush(rect, bgColor, bgColor2, gradientMode);
|
g.FillRectangle(bgBrush, rect);//填充背景
|
}
|
else
|
{
|
Brush b = new SolidBrush(bgColor);
|
g.FillRectangle(b, rect);
|
}
|
}
|
}
|
}
|
}
|