花里胡哨的圆角按钮 - RadiusButton

圆角按钮的实现

实现原理:

  1. 创建RadiusButton继承自Button,重写OnPaint
  2. 获取Graphics,创建圆角按钮Outer路径,用BorderColor填充内部区域
  3. 创建Inner路径,用ButtonColor填充内部区域
  4. 绘制按钮的Text
  5. 将按钮扁平化设置,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

视频地址:https://www.bilibili.com/video/av87060226

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值