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();
            }
        }
private GraphicsPath CreateRoundRect(float rleft, float rtop, float rwidth, float rheight)
        {
            float r = radius;
            if (rwidth < rheight)
            {
                if (radius > rwidth / 2f)
                    r = rwidth / 2f;
            }
            else
            {
                if (radius > rheight / 2f)
                    r = rheight / 2f;
            }

            GraphicsPath path;
            RectangleF rectRow = new RectangleF(rleft, rtop + r, rwidth, rheight - r * 2);
            RectangleF rectColumn = new RectangleF(rleft + r, rtop, rwidth - r * 2, rheight);
            path = new GraphicsPath(FillMode.Winding);
            path.AddRectangle(rectRow);
            path.AddRectangle(rectColumn);
            //左上
            path.AddEllipse(rleft, rtop, r * 2, r * 2);
            //右上
            path.AddEllipse(rleft + rwidth - r * 2, rtop, r * 2, r * 2);
            //左下
            path.AddEllipse(rleft, rtop + rheight - r * 2, r * 2, r * 2);
            //右下
            path.AddEllipse(rleft + rwidth - r * 2, rtop + rheight - r * 2, r * 2, r * 2);
            return path;
        }

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;
        }

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

到此这篇关于C#实现自定义圆角按钮的文章就介绍到这了,更多相关C#圆角按钮内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#中Winform 实现Ajax效果自定义按钮

    技术看点 WinForm自定义控件的使用 自定义控件gif动画的播放 需求及效果 又来一波 C# GDI自定义控件show .这个控件已经使用几年了,最近找出来重构一下.原来是没有边框的,那么导致导航的功能不是很突出.本来想加个效果:在执行单击时显示Loading动画,在执行完单击事件后恢复原样.这就是网页里见到的局部刷新,Ajax常用的场景.需求来自几年前一个智能储物柜项目,人机界面有个美工设计好的效果图,为了省事和通用,需要一个透明的按钮来实现导航的任务.就是控件只是设计时可见,运行时不可见

  • C# WPF 自定义按钮的方法

    本文介绍WPF一种自定义按钮的方法. 实现效果 使用图片做按钮背景: 自定义鼠标进入时效果: 自定义按压效果: 自定义禁用效果 实现效果如下图所示: 实现步骤 创建CustomButton.cs,继承自Button: 创建一个资源文件ButtonStyles.xaml: 在资源文件中设计按钮的Style: 在CustomButton.cs中添加Style中需要的依赖属性: 在程序中添加资源并引用(为了方便在不同的程序中引用自定义按钮,自定义按钮放在独立的类库中,应用程序中进行资源合并即可). 示

  • C#实现自定义圆角按钮的方法

    Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮. 1.绘制圆角按钮框需要用到系统自带的绘制方法:首先引入Gdi32.dll中的CreateRoundRectRgn方法.经过验证此方法在大量控件情况下使用,会导致GDI+绘图问题!现在改用自己绘制的圆角GraphicsPath进行填充显示,效果更好,圆角更圆润了! 重写OnPaint方法: protected override void OnPaint(PaintEventArgs

  • Android中快速便捷的实现圆角按钮方法详解

    前言 大家应该都知道,圆角按钮是我们在做界面时常常遇到的UI样式.通常的办法,是做一个drawable,比如这样: <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色

  • Android编程自定义圆角半透明Dialog的方法

    本文实例讲述了Android编程自定义圆角半透明Dialog的方法.分享给大家供大家参考,具体如下: 效果图如下: 只是在实例化的时候使用带样式的构造函数即可 new MyDialog(GameActivity.this, R.style.dialog); 在value文件夹中添加mydialogthemes.xml <?xml version="1.0″ encoding=" utf-8″?> <resources> <style name="

  • JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析

    本文实例讲述了JS+HTML实现自定义上传图片按钮并显示图片功能的方法.分享给大家供大家参考,具体如下: 在web开发中,上传文件功能通过type为file的input标签即可实现.但input的显示效果仅为一个按钮,且不能修改UI.如果要实现自定义上传按钮,一般需要设置input为不可见,然后将input与自定义界面放在同一个div中,并将input铺在界面上方: <!DOCTYPE html> <html> <head> <meta http-equiv=&q

  • Android 详解自定义圆角输入框和按钮的实现流程

    Android-自定义圆角输入框和按钮 我们的征程是星辰大海,而非人间烟尘 自定义圆角输入框 效果 1.在drawable/下面new Drawable Resources File 2.新建shape文件,在里面自定义xml文件样式 代码文件 <!-- res/drawable/button_shape_normal.xml --> <shape xmlns:android="http://schemas.android.com/apk/res/android" a

  • Android圆角按钮的制作方法

    本文实例为大家分享了Android制作圆角按钮的具体代码,供大家参考,具体内容如下 [主要步骤] 创建一个XML文件 以此文件作为Button的Background 1.创建XML文件 在res目录下的drawable-mdpi下建立XML文件 button_frame_shape.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas

  • Winform控件优化之圆角按钮2

    目录 前言 圆角按钮实现的进一步优化 主要功能[圆角方面] OnPaint方法中不要使用e.ClipRectangle 重新创建Region的锯齿问题和优势 代码具体实现 测试扩展按钮控件ButtonPro TextRenderer.DrawText绘制文本 使用StringFormat.GenericTypographic 仅仅重写OnPaintBackground 使用TextRenderer.DrawText绘制文本 前言 接上一篇Winform控件优化之圆角按钮1继续介绍圆角按钮的实现和

  • Winform控件优化之圆角按钮1

    目录 前言 圆角按钮实现[重写OnPaint实现圆角绘制] 代码主要关键点或思路.优化 使用圆角按钮 利用填充内外两层圆角矩形路径形成Border 通过缩放实现正确的内外两层圆角矩形路径 CDI+路径的填充模式 直接绘制路径作为边框[推荐]** 可以改进和实现的 在Paint事件中重绘控件为圆角 前言 Windows 11下所有控件已经默认采用圆角,其效果更好.相对有着更好的优化,只是这是默认的行为,无法进一步自定义. 圆角按钮实现[重写OnPaint实现圆角绘制] 控件自定义绘制的关键在于:重

  • FCKeditor添加自定义按钮的方法

    增加按钮有以下几步: 1.为按钮增加图片: FCK的所有按钮图片是存放在一个图片文件里的,这一点比较独特,文件存放在相应皮肤目录下,如:/FCK/skins/silever/fck_strip.gif.通过Fireworks或Phtoshop打开该文件可以发现一个很长的图片,里面包含所有按钮的图片,现在您可以在该图片的最下面增加您自定义的按钮,注意,每个按钮的尺寸是16*16px. 2.为按钮增加功能代码: 增加按钮需要对FCK/editor/js目录中的两个核心文件进行修改:fckeditor

随机推荐