zoukankan      html  css  js  c++  java
  • C#绘制自定义圆角按钮

    Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮。

    1.绘制圆角按钮框需要用到系统自带的绘制方法:首先引入Gdi32.dll中的CreateRoundRectRgn方法。经过验证此方法在大量控件情况下使用,会导致GDI+绘图问题!现在改用自己绘制的圆角GraphicsPath进行填充显示,效果更好,圆角更圆润了!

    重写OnPaint方法:

     

    protected override void OnPaint(PaintEventArgs pe)
            {
                if (!roundCorner)
                {
                    base.OnPaint(pe);
                    return;
                }
                Graphics g = pe.Graphics;
                g.SmoothingMode = SmoothingMode.AntiAlias;
                //g.SmoothingMode = SmoothingMode.HighQuality;
                //g.CompositingQuality = CompositingQuality.HighQuality;
                //g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                Rectangle rect = this.ClientRectangle;
                Brush brhBorder = new SolidBrush(crBorderPainting);
                Brush brhRect = new SolidBrush(BackColor);
                Brush b0 = new SolidBrush(this.Parent.BackColor);
                Brush bfont = new SolidBrush(ForeColor);
                try
                {
                    g.Clear(this.Parent.BackColor);
                    int borderSize = FlatAppearance.BorderSize;
                    try
                    {
                        GraphicsPath path = CreateRoundRect(rect.Left, rect.Top, rect.Left + rect.Width - borderSize, rect.Top + rect.Height - borderSize);
                        g.FillPath(brhBorder, path);
                        path.Dispose();
                        path = CreateRoundRect(rect.Left + borderSize /2f, rect.Top + borderSize / 2f, rect.Left + rect.Width - borderSize * 2, rect.Top + rect.Height - borderSize * 2);
                        g.FillPath(brhRect, path);
                        path.Dispose();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("FillPath:" + e.Message);
                    }
                    if (this.Text != string.Empty)
                    {
                        StringFormat sf = StringFormat.GenericTypographic;
                        sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
                        SizeF sizeoftext = g.MeasureString(this.Text, Font);
                        float tx = (float)((this.Width - sizeoftext.Width) / 2.0);
                        float ty = (float)((this.Height - sizeoftext.Height) / 2.0);
                        g.DrawString(this.Text, Font, bfont, tx, ty);
                    }
                }
                finally
                {
                    b0.Dispose();
                    brhBorder.Dispose();
                    brhRect.Dispose();
                    bfont.Dispose();
                }
            }

     

     

    2.如果需要增加悬浮效果,可以重写OnMouseEnter、OnMouseLeave事件来改变边界及背景色。

    private Color crBorderActive = Color.FromArgb(Convert.ToInt32("FF3283C4", 16));
    private Color crRectActive = Color.FromArgb(Convert.ToInt32("FFE3F3FB", 16));
    private Color crBorderDefault = Color.FromArgb(215, 215, 215);
    protected override void OnMouseEnter(EventArgs e)
            {
                base.OnMouseEnter(e);
                this.BackColor = crRectActive;
                this.FlatAppearance.BorderColor = crBorderActive;
            }
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                this.BackColor = Color.White;
                this.FlatAppearance.BorderColor = crBorderDefault;
            }

    至此一个圆角按钮就完成了^_^。效果如下:

    看完的同志们记得给点赞,纯自己手工打造!

     

  • 相关阅读:
    margin塌陷(collapse)
    this的值
    变量、函数声明提升
    Git与Svn的区别—笔记1
    ECMAScript 总结
    正则表达式
    i2c 通信
    player/stage 学习---安装
    各种分区类型对应的partition_Id
    ubuntu 映射网络驱动器到本地
  • 原文地址:https://www.cnblogs.com/hejoy91/p/13591027.html
Copyright © 2011-2022 走看看