圆角按钮的实现
实现原理:
- 创建RadiusButton继承自Button,重写OnPaint
- 获取Graphics,创建圆角按钮Outer路径,用BorderColor填充内部区域
- 创建Inner路径,用ButtonColor填充内部区域
- 绘制按钮的Text
- 将按钮扁平化设置,FlatAppearance的Border设置为0
关键代码
创建圆角路径
private GraphicsPath GetRoundedRect(Rectangle rect, int radius)
{
int diameter = 2 * radius;
Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
GraphicsPath path = new GraphicsPath();
path.AddArc(arcRect, 180, 90);
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, 270, 90);
arcRect.Y = rect.Bottom - diameter;
path.AddArc(arcRect, 0, 90);
arcRect.X = rect.Left;
path.AddArc(arcRect, 90, 90);
path.CloseFigure();
return path;
}
创建内部矩形
private Rectangle GetInnerRectangle(Rectangle rect, int borderSize)
{
var w = rect.Width - 2 * borderSize;
var h = rect.Height - 2 * borderSize;
var x = rect.X + borderSize;
var y = rect.Y + borderSize;
return new Rectangle(x, y, w, h);
}
重写OnPaint
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
var g = pevent.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias;
// 1. 填充全区域
using (Brush brush = new SolidBrush(_isHovering ? _onHoverBorder : _borderColor))
{
var outer = GetRoundedRect(ClientRectangle, _borderRadius);
g.FillPath(brush, outer);
}
// 2. 填充内部区域
using(Brush brush = new SolidBrush(_isHovering ? _onHoverButtonColor : _buttonColor))
{
var innerRect = GetInnerRectangle(ClientRectangle, _borderThickness);
var inner = GetRoundedRect(innerRect, _borderRadius);
g.FillPath(brush, inner);
}
// 3. 绘制文字
using(Brush brush = new SolidBrush(_isHovering ? _onHoverTextColor : ForeColor))
{
var sf = g.MeasureString(Text, Font);
g.DrawString(Text, Font, brush, (Width - sf.Width) / 2, (Height - sf.Height) / 2);
}
}
完整代码:https://download.csdn.net/download/feixuebinbqi/12139479