CSkin博客

标题: 【圆角按钮美化】C# winform中 Button 美化(圆角) [打印本页]

作者: DD2013    时间: 2015-1-11 17:13
标题: 【圆角按钮美化】C# winform中 Button 美化(圆角)
说明:
还是老规矩,先上效果图。

效果图:


思路和代码:
(代码比较乱,自己稍微整理下就可以使用,不传全部源代码了,防止伸手党)
[C#] 纯文本查看 复制代码
public  class ButtonEx : Button
    {
        private Color _baseColor = Color.FromArgb(51, 161, 224);//基颜色
        private ControlState _controlState;//控件状态
        private int _imageWidth = 18;
        private RoundStyle _roundStyle = RoundStyle.All;//圆角
        private int _radius = 8;                        //圆角半径

        public ButtonEx(): base()
        {
            this.SetStyle(
                ControlStyles.UserPaint |  //控件自行绘制,而不使用操作系统的绘制
                ControlStyles.AllPaintingInWmPaint | //忽略擦出的消息,减少闪烁。
                ControlStyles.OptimizedDoubleBuffer |//在缓冲区上绘制,不直接绘制到屏幕上,减少闪烁。
                ControlStyles.ResizeRedraw | //控件大小发生变化时,重绘。                  
                ControlStyles.SupportsTransparentBackColor, true);//支持透明背景颜色
        }

        [DefaultValue(typeof(Color), "51, 161, 224")]
        public Color BaseColor
        {
            get { return _baseColor; }
            set
            {
                _baseColor = value;
                base.Invalidate();
            }
        }
        [DefaultValue(18)]//默认值为18px,最小12px
        public int ImageWidth
        {
            get { return _imageWidth; }
            set
            {
                if (value != _imageWidth)
                {

                    _imageWidth = value < 12 ? 12 : value;
                    base.Invalidate();
                }
            }
        }
        [DefaultValue(typeof(RoundStyle), "1")]//默认全部都是圆角
        public RoundStyle RoundStyle
        {
            get { return _roundStyle; }
            set
            {
                if (_roundStyle != value)
                {
                    _roundStyle = value;
                    base.Invalidate();
                }
            }
        }
        [DefaultValue(8)]//设置圆角半径,默认值为8,最小值为4px
        public int Radius
        {
            get { return _radius; }
            set
            {
                if (_radius != value)
                {
                    _radius = value < 4 ? 4 : value;
                    base.Invalidate();
                }
            }
        }
        internal ControlState ControlState  //控件的状态
        {
            get { return _controlState; }
            set
            {
                if (_controlState != value)
                {
                    _controlState = value;
                    base.Invalidate();
                }
            }
        }
        protected override void OnMouseEnter(EventArgs e)//鼠标进入时
        {
            base.OnMouseEnter(e);
            ControlState = ControlState.Hover;//正常
        }
        protected override void OnMouseLeave(EventArgs e)//鼠标离开
        {
            base.OnMouseLeave(e);
            ControlState = ControlState.Normal;//正常
        }
        protected override void OnMouseDown(MouseEventArgs e)//鼠标按下
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left && e.Clicks == 1)//鼠标左键且点击次数为1
            {
                ControlState = ControlState.Pressed;//按下的状态
            }
        }
        protected override void OnMouseUp(MouseEventArgs e)//鼠标弹起
        {
            base.OnMouseUp(e);
            if (e.Button == MouseButtons.Left && e.Clicks == 1)
            {
                if (ClientRectangle.Contains(e.Location))//控件区域包含鼠标的位置
                {
                    ControlState = ControlState.Hover;
                }
                else
                {
                    ControlState = ControlState.Normal;
                }
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            base.OnPaintBackground(e);

            Graphics g = e.Graphics;
            Rectangle imageRect;//图像区域
            Rectangle textRect;//文字区域

            this.CalculateRect(out imageRect, out textRect);

            g.SmoothingMode = SmoothingMode.AntiAlias;

            Color baseColor;
            Color borderColor;
            Color innerBorderColor = this._baseColor;//Color.FromArgb(200, 255, 255, 255); ;

            if (Enabled)
            {
                switch (ControlState)
                {
                    case ControlState.Hover:
                        baseColor = GetColor(_baseColor, 0, -35, -24, -30);
                        borderColor = _baseColor;
                        break;
                    case ControlState.Pressed:
                        baseColor = GetColor(_baseColor, 0, -35, -24, -9);
                        borderColor = _baseColor;
                        break;
                    default:
                        baseColor = _baseColor;
                        borderColor = _baseColor;
                        break;
                }
            }
            else
            {
                baseColor = SystemColors.ControlDark;
                borderColor = SystemColors.ControlDark;
            }

            this.RenderBackgroundInternal(
                g,
                ClientRectangle,
                baseColor,
                borderColor,
                innerBorderColor,
                RoundStyle,
                Radius,
                0.35f,
                false,
                true,
                LinearGradientMode.Vertical);

            if (Image != null)
            {
                g.InterpolationMode = InterpolationMode.HighQualityBilinear;
                g.DrawImage(Image,imageRect,0,0,Image.Width,Image.Height,GraphicsUnit.Pixel);
            }
            TextRenderer.DrawText(g,Text,Font,textRect,ForeColor,GetTextFormatFlags(TextAlign, RightToLeft == RightToLeft.Yes));
        }


        private Color GetColor(Color colorBase, int a, int r, int g, int b)
        {
            int a0 = colorBase.A;
            int r0 = colorBase.R;
            int g0 = colorBase.G;
            int b0 = colorBase.B;
            if (a + a0 > 255) { a = 255; } else { a = Math.Max(a + a0, 0); }
            if (r + r0 > 255) { r = 255; } else { r = Math.Max(r + r0, 0); }
            if (g + g0 > 255) { g = 255; } else { g = Math.Max(g + g0, 0); }
            if (b + b0 > 255) { b = 255; } else { b = Math.Max(b + b0, 0); }

            return Color.FromArgb(a, r, g, b);
        }


        internal void RenderBackgroundInternal(
               Graphics g,
               Rectangle rect,
               Color baseColor,
               Color borderColor,
               Color innerBorderColor,
               RoundStyle style,
               int roundWidth,//圆角半径
               float basePosition,
               bool drawBorder,
               bool drawGlass,
               LinearGradientMode mode)
        {
            if (drawBorder)//是否画边框
            {
                rect.Width--;
                rect.Height--;
            }

            using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode))
            {
                Color[] colors = new Color[4];
                colors[0] = GetColor(baseColor, 0, 35, 24, 9);
                colors[1] = GetColor(baseColor, 0, 0, 0, 0);
                colors[2] = baseColor;
                colors[3] = GetColor(baseColor, 0, 0 ,0 ,0);

                ColorBlend blend = new ColorBlend();
                blend.Positions = new float[] { 0.0f, basePosition, basePosition, 1.0f };
                blend.Colors = colors;
                brush.InterpolationColors = blend;
                if (style != RoundStyle.None)
                {
                    using (GraphicsPath path =
                        GraphicsPathHelper.CreatePath(rect, roundWidth, style, false))
                    {
                        g.FillPath(brush, path);
                    }

                    if (baseColor.A > 80)
                    {
                        Rectangle rectTop = rect;

                        if (mode == LinearGradientMode.Vertical)
                        {
                           // rectTop.Height = (int)(rectTop.Height * basePosition);
                        }
                        else
                        {
                           // rectTop.Width = (int)(rect.Width * basePosition);
                        }
                        using (GraphicsPath pathTop = GraphicsPathHelper.CreatePath(
                            rectTop, roundWidth, RoundStyle.Top, false))
                        {
                            using (SolidBrush brushAlpha =
                                new SolidBrush(Color.FromArgb(80, 255, 255, 255)))
                            {
                                g.FillPath(brushAlpha, pathTop);
                            }
                        }
                    }

                }



作者: CastleDrv    时间: 2015-1-11 19:16
支持一个
作者: ck261310    时间: 2015-1-11 20:50
漂亮,学习了
作者: mumupudding    时间: 2015-1-12 13:34
代码不完整啊,还有引用不明确,没法使用
作者: 乔克斯    时间: 2015-1-13 10:14
鉴于论坛中熟悉GDI+绘制的比较少,楼主不介意的话还是放出源码~有助于大家学习哦。
作者: xiaobo    时间: 2015-1-18 02:07
漂亮!
作者: wuxunhua    时间: 2015-2-9 15:54
下来看看
作者: wuxunhua    时间: 2015-2-9 15:55
下来看看,学习下。
作者: zoney88    时间: 2015-2-13 19:36
挺漂亮,不知闪烁不
作者: wmvsmm    时间: 2015-3-12 10:55
mark button
作者: aaaaasuper    时间: 2015-3-13 09:28
非常不错,很好
作者: 864548336    时间: 2015-4-30 22:37
很好看,要是分享一下就好了
作者: seling    时间: 2015-8-14 15:18
呵呵呵。 学些了。 很不错的了。 美化按钮 。
作者: whgfu    时间: 2015-8-15 20:02
伸手党来了
作者: xiaolong0928    时间: 2015-8-25 15:54
急需用哦!谢谢楼主!!!
作者: 斯盖    时间: 2015-9-30 15:56
谢谢了    也挺好的   
作者: 林夕子    时间: 2015-10-1 09:37
楼主写的好,我借鉴一下
作者: 林夕子    时间: 2015-10-1 11:06
mumupudding 发表于 2015-1-12 13:34
代码不完整啊,还有引用不明确,没法使用

同感,运行时候一直出错
作者: 林夕子    时间: 2015-10-1 11:06
mumupudding 发表于 2015-1-12 13:34
代码不完整啊,还有引用不明确,没法使用

同感,运行时候一直出错
作者: ssxh_tanhc    时间: 2015-10-8 16:21
good job, thanks
作者: ssxh_tanhc    时间: 2015-10-8 16:21
good job, thanks
作者: ssxh_tanhc    时间: 2015-10-8 16:22
good job, thanks
作者: ssxh_tanhc    时间: 2015-10-8 16:34
good job, thanks
作者: hambor    时间: 2015-10-26 22:42
感谢LZ对论坛做出的贡献~
作者: spaceman_3    时间: 2015-12-23 20:29
漂亮,学习了
作者: tymfl    时间: 2016-7-6 16:19
感谢楼主分享
作者: jxs10647    时间: 2016-8-30 10:39
你好,怎么样 才能实现 你这样的 美化  控件效果。这是我QQ:1064700387 方便的话教我一下。
作者: neal2016    时间: 2017-1-9 15:47
厉害厉害
作者: jobfind    时间: 2017-1-11 22:21
谁知道你实现没有
作者: 539    时间: 2017-1-16 14:52
好资源,赞一个
作者: xiaoluo    时间: 2017-1-22 15:46
很不错,学习了
作者: DD2013    时间: 2017-1-23 10:58
年后放出源码
作者: rexgg    时间: 2017-3-16 09:17
按钮很好看,希望楼主能造福一下大众
作者: heping072054214    时间: 2017-3-16 10:20
先看看效果
作者: L_dragonZZ    时间: 2017-5-5 18:44
楼主可以放出源码吗?
作者: xiaoshowtime0    时间: 2017-6-14 15:22
按钮效果很不错
作者: rantian123456    时间: 2017-7-8 22:22
非常好看 谢谢分享
作者: 岚天大大    时间: 2017-7-9 10:27
感谢LZ对论坛做出的贡献~
作者: Leadzery    时间: 2017-7-16 01:11
https://pan.baidu.com/s/1eSteTQM
作者: Leadzery    时间: 2017-7-16 01:12
https://pan.baidu.com/s/1eSteTQM
作者: brucelut    时间: 2017-8-8 15:16
mark一下,学习
作者: zgp405239521    时间: 2017-8-9 11:55
mark一下,学习
作者: scruom    时间: 2017-8-11 14:49
Leadzery 发表于 2017-7-16 01:12
https://pan.baidu.com/s/1eSteTQM

密码?谢谢分享!
作者: 纯洁边缘人    时间: 2017-8-21 11:52
Leadzery 发表于 2017-7-16 01:12
https://pan.baidu.com/s/1eSteTQM

密码?谢谢分享!
作者: junsingchan    时间: 2017-9-15 10:37
谢谢分享
作者: 狂哥    时间: 2017-9-21 13:12
没有源码不开心
作者: livehu5188    时间: 2017-10-30 22:22
好的 谢谢啊
作者: 白灵沙    时间: 2017-11-20 09:05
lz你的这个代码原理是什么啊?可以分享给我么,谢谢啦
作者: 白灵沙    时间: 2017-11-20 09:08
就是做C#程序的时候需要一个将图片搞成圆角的方法,把头像美化下。但找不到具体的代码,虽然在网上找到一些,但还是一些看不懂,之前做HTML的话一个属性就搞定了,这个没接触过,一点思路都没有
作者: DD2013    时间: 2017-11-24 15:26
白灵沙 发表于 2017-11-20 09:08
就是做C#程序的时候需要一个将图片搞成圆角的方法,把头像美化下。但找不到具体的代码,虽然在网上找到一些 ...

做成圆角头像一般会使用一个圆形遮罩层,做成控件可以选择图片
作者: 茄子绝杀    时间: 2017-11-25 11:12
这个效果做的不错,学习了。。。。。。。。。。。。。。。。。。。。
作者: 水灬手    时间: 2017-11-28 10:32
楼主 可以分享下源码嘛 谢谢
作者: llingg    时间: 2017-12-5 16:45
感谢楼主分享
作者: csy243    时间: 2017-12-11 16:35
谢谢楼主分享
作者: 沉沦的学弱丶    时间: 2018-1-5 18:59
这个美化确实很赞!
作者: linshida114    时间: 2018-3-19 16:22
感谢LZ对论坛做出的贡献~
作者: liangyuan    时间: 2018-7-29 19:34
厉害了!
作者: Leadzery    时间: 2018-10-15 23:52
谢谢楼主无私奉献,好人一生平安
作者: TIANQIANG    时间: 2018-11-4 12:47
学习下看看怎么样
作者: jervis88    时间: 2018-12-6 15:30
#在这里快速回复#漂亮,学习了
作者: yuzhen    时间: 2018-12-6 21:13
学习了,谢谢楼主
作者: kuangyuan    时间: 2018-12-13 17:02
        感谢LZ对论坛做出的贡献~
作者: yooyoyoyoy    时间: 2019-1-24 17:55
不错 参考一下
作者: zhuyibin    时间: 2019-1-31 12:53
源码有吗
作者: 哈呀嘿    时间: 2019-4-27 21:06
赞一个。。。。。。。。
作者: liyingjie    时间: 2019-6-18 09:05
感谢LZ对论坛做出的贡献~
作者: jinking588    时间: 2019-6-20 14:43
按钮美化得真好看,谢谢您的分享,永远支持您。
作者: dssadsa    时间: 2019-8-3 13:49
.啥擦拭呃呃
作者: jonW    时间: 2019-9-11 23:16
Leadzery 发表于 2017-7-16 01:12
https://pan.baidu.com/s/1eSteTQM

密码是多少呀
作者: liujiangsh    时间: 2019-11-3 16:58
漂亮,学习了
作者: liujiangsh    时间: 2019-11-3 16:58
密码please
作者: kuying    时间: 2020-5-22 10:16
提取码错误
作者: Kindergarten    时间: 2020-6-16 00:40
无意看到,还是挺喜欢的,可惜不会呀。全部代码可以给一下吗?
作者: Rioleio    时间: 2020-8-11 11:15
楼主,求密码
作者: Rioleio    时间: 2020-8-11 16:01
提取码:m63k




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2