博客
关于我
C# WinForm 圆角button
阅读量:493 次
发布时间:2019-03-07

本文共 5773 字,大约阅读时间需要 19 分钟。

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace ExerciseUIPrj{    public partial class XButton : Button    {        enum model        {            hover,            enter,            press,            enable        }        public Color HoverBackColor { get; set; }        public Color EnterBackColor { get; set; }        public Color PressBackColor { get; set; }        public Color HoverForeColor { get; set; }        public Color EnterForeColor { get; set; }        public Color PressForeColor { get; set; }        public int Radius { get; set; }        model paintmodel = model.hover;        public XButton()        {            InitializeComponent();            FlatStyle = FlatStyle.Flat;            FlatAppearance.BorderSize = 0;            FlatAppearance.BorderColor = Color.FromArgb(0, 0, 0, 0);            FlatAppearance.MouseDownBackColor = Color.Transparent;            FlatAppearance.MouseOverBackColor = Color.Transparent;            SetDefaultColor();        }        public void SetDefaultColor()        {            HoverBackColor = Color.LightBlue;            EnterBackColor = Color.Blue;            PressBackColor = Color.DarkBlue;            HoverForeColor = Color.White;            EnterForeColor = Color.White;            PressForeColor = Color.White;            Radius = 18;        }        protected override void OnPaint(PaintEventArgs e)        {            base.OnPaint(e);            var colorback = HoverBackColor;            var colorfore = HoverForeColor;            switch (paintmodel)            {                case model.hover:                    colorback = HoverBackColor;                    colorfore = HoverForeColor;                    break;                case model.enter:                    colorback = EnterBackColor;                    colorfore = EnterForeColor;                    break;                case model.press:                    colorback = PressBackColor;                    colorfore = PressForeColor;                    break;                case model.enable:                    colorback = Color.LightGray;                    break;                default:                    colorback = HoverBackColor;                    colorfore = HoverForeColor;                    break;            }            Draw(e.ClipRectangle, e.Graphics, false, colorback);            DrawText(e.ClipRectangle, e.Graphics, colorfore);        }        protected override void OnMouseEnter(EventArgs e)        {            paintmodel = model.enter;            base.OnMouseEnter(e);        }        protected override void OnMouseLeave(EventArgs e)        {            paintmodel = model.hover;            base.OnMouseLeave(e);        }        protected override void OnMouseDown(MouseEventArgs mevent)        {            paintmodel = model.press;            base.OnMouseDown(mevent);        }        protected override void OnEnabledChanged(EventArgs e)        {            paintmodel = Enabled ? model.hover : model.enable;            Invalidate();            base.OnEnabledChanged(e);        }        void Draw(Rectangle rectangle, Graphics g, bool cusp, Color begin_color, Color? end_colorex = null)        {            Color end_color = end_colorex == null ? begin_color : (Color)end_colorex;            int span = 2;            g.SmoothingMode = SmoothingMode.AntiAlias;            LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(rectangle, begin_color, end_color, LinearGradientMode.Vertical);            if (cusp)            {                span = 10;                PointF p1 = new PointF(rectangle.Width - 12, rectangle.Y + 10);                PointF p2 = new PointF(rectangle.Width - 12, rectangle.Y + 30);                PointF p3 = new PointF(rectangle.Width, rectangle.Y + 20);                PointF[] ptsArray = { p1, p2, p3 };                g.FillPolygon(myLinearGradientBrush, ptsArray);            }            g.FillPath(myLinearGradientBrush, DrawRoundRect(rectangle.X, rectangle.Y, rectangle.Width - span, rectangle.Height - 1, Radius));        }        void DrawText(Rectangle rectangle, Graphics g, Color color)        {            SolidBrush sbr = new SolidBrush(color);            var rect = new RectangleF();            switch (TextAlign)            {                case ContentAlignment.MiddleCenter:                    rect = getTextRec(rectangle, g);                    break;                default:                    rect = getTextRec(rectangle, g);                    break;            }            g.DrawString(Text, Font, sbr, rect);        }        RectangleF getTextRec(Rectangle rectangle, Graphics g)        {            var rect = new RectangleF();            var size = g.MeasureString(Text, Font);            if (size.Width > rectangle.Width || size.Height > rectangle.Height)            {                rect = rectangle;            }            else            {                rect.Size = size;                rect.Location = new PointF(rectangle.X + (rectangle.Width - size.Width) / 2, rectangle.Y + (rectangle.Height - size.Height) / 2);            }            return rect;        }        GraphicsPath DrawRoundRect(int x, int y, int width, int height, int radius)        {            GraphicsPath gp = new GraphicsPath();            gp.AddArc(x, y, radius, radius, 180, 90);            gp.AddArc(width - radius, y, radius, radius, 270, 90);            gp.AddArc(width - radius, height - radius, radius, radius, 0, 90);            gp.AddArc(x, height - radius, radius, radius, 90, 90);            gp.CloseAllFigures();            return gp;        }    }}

 

转载地址:http://utcjz.baihongyu.com/

你可能感兴趣的文章
将字符串中的特定字符替换为其他字符
查看>>
创建一个简单的SpingBoot项目,并且部署到linux上运行
查看>>
【Linux】程序地址空间,分段式、分页式存储理解
查看>>
mysql8.0及以上在my.cnf设置sql_mode之后mysql无法启动
查看>>
C语言编译错误列表
查看>>
万倍币传说不再,价值回归
查看>>
这可能是后浪们逆袭的唯一机会
查看>>
观点 | COMP的流动性挖矿并非万能解药
查看>>
尽管DeFi项目数量下降,但总价值却仍在不断攀升
查看>>
Bakkt完成1.82亿美元首轮融资,这家交易所凭什么这么牛?
查看>>
每天维护费700多万美元!比特币当之无愧是“最安全区块链”
查看>>
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
查看>>
6大亮点抢先看!Facebook加密货币项目Libra白皮书解读
查看>>
比特币回调至6000美元?分析师表示“很有可能”
查看>>
数字印钞界迎来重磅精英机构,普通人还有翻身机会吗? | 加密货币与阶层穿越...
查看>>
Java初识和开发环境搭建
查看>>
Wordpress主题Git后台清净模式设置
查看>>
张一鸣:创业7年,我经历的5件事
查看>>
SQL基础语法
查看>>
SQL 已死,但 SQL 将永存
查看>>