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 JYControl { //public partial class RoundButton : Button //{ // public RoundButton() // { // InitializeComponent(); // } // protected override void OnPaint(PaintEventArgs pe) // { // base.OnPaint(pe); // } //} public partial class RoundButton : Button { #region --成员变量-- RectangleF rect = new RectangleF();//控件矩形 bool mouseEnter;//鼠标是否进入控件区域的标志 bool buttonPressed;//按钮是否按下 bool buttonClicked;//按钮是否被点击 #endregion #region --属性-- #region 形状 /// /// 设置或获取圆形按钮的圆的边距离方框边的距离 /// [Browsable(true), DefaultValue(2)] [Category("Appearance")] public int DistanceToBorder { get; set; } #endregion #region 填充色 /// /// 获取或设置按钮主体颜色 /// /// The color of the focus. [Browsable(true), DefaultValue(typeof(Color), "DodgerBlue"), Description("按钮主体渐变起始颜色")] [Category("Appearance")] public Color ButtonCenterColorEnd { get; set; } /// /// 获取或设置按钮主体颜色 /// [Browsable(true), DefaultValue(typeof(Color), "CornflowerBlue"), Description("按钮主体渐变终点颜色")] [Category("Appearance")] public Color ButtonCenterColorStart { get; set; } /// /// 获取或设置按钮主体颜色渐变方向 /// [Browsable(true), DefaultValue(90), Description("按钮主体颜色渐变方向,X轴顺时针开始")] [Category("Appearance")] public int GradientAngle { get; set; } /// /// 是否显示中间标志 /// [Browsable(true), DefaultValue(typeof(bool), "true"), Description("是否显示中间标志")] [Category("Appearance")] public bool IsShowIcon { get; set; } /// /// 按钮中间标志填充色 /// [Browsable(true), DefaultValue(typeof(Color), "Black"), Description("按钮中间标志填充色")] [Category("Appearance")] public Color IconColor { get; set; } #endregion #region 边框 /// /// 获取或设置边框大小 /// [Browsable(true), DefaultValue(4), Description("按钮边框大小")] [Category("Appearance")] public int BorderWidth { get; set; } /// /// 获取或设置按钮边框颜色 /// /// The color of the focus. [Browsable(true), DefaultValue(typeof(Color), "Black"), Description("按钮边框颜色")] [Category("Appearance")] public Color BorderColor { get; set; } /// /// 获取或设置边框透明度 /// [Browsable(true), DefaultValue(200), Description("设置边框透明度:0-255")] [Category("Appearance")] public int BorderTransparent { get; set; } /// /// 获取或设置按钮获取焦点后边框颜色 /// /// The color of the focus. [Browsable(true), DefaultValue(typeof(Color), "Orange"), Description("按钮获得焦点后的边框颜色")] [Category("Appearance")] public Color FocusBorderColor { get; set; } #endregion #endregion #region --构造函数-- /// /// 构造函数 /// public RoundButton() { // 控件风格 SetStyle(ControlStyles.SupportsTransparentBackColor, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.UserPaint, true); //初始值设定 this.Height = this.Width = 80; DistanceToBorder = 4; ButtonCenterColorStart = Color.CornflowerBlue; ButtonCenterColorEnd = Color.DodgerBlue; BorderColor = Color.Black; FocusBorderColor = Color.Orange; IconColor = Color.Black; BorderWidth = 4; BorderTransparent = 200; GradientAngle = 90; mouseEnter = false; buttonPressed = false; buttonClicked = false; IsShowIcon = true; InitializeComponent(); } #endregion #region --重写部分事件-- #region OnPaint事件 /// /// 控件绘制 /// /// protected override void OnPaint(PaintEventArgs pevent) { //base.OnPaint(pevent); base.OnPaintBackground(pevent); Graphics g = pevent.Graphics; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.SmoothingMode = SmoothingMode.AntiAlias;//抗锯齿 myResize();//调整圆形区域 var brush = new LinearGradientBrush(rect, ButtonCenterColorStart, ButtonCenterColorEnd, GradientAngle); PaintShape(g, brush, rect);//绘制按钮中心区域 DrawBorder(g);//绘制边框 DrawStateIcon(g);//绘制按钮功能标志 if (mouseEnter) { DrawHighLight(g);//绘制高亮区域 DrawStateIcon(g);//绘制按钮功能标志 } } #endregion #region 鼠标 /// /// 鼠标点击事件 /// /// protected override void OnMouseClick(MouseEventArgs e) { base.OnMouseClick(e); buttonClicked = !buttonClicked; } /// /// Raises the event. /// /// A that contains the event data. protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (e.Button != MouseButtons.Left) return; buttonPressed = false; base.Invalidate(); } /// /// Raises the event. /// /// A that contains the event data. protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button != MouseButtons.Left) return; buttonPressed = true; } /// /// 鼠标进入按钮 /// /// protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); mouseEnter = true; } /// /// 鼠标离开控件 /// /// protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); mouseEnter = false; } #endregion #endregion #region --自定义函数-- /// /// 绘制中心区域标志 /// /// private void DrawStateIcon(Graphics g) { if (IsShowIcon) { if (buttonClicked) { GraphicsPath startIconPath = new GraphicsPath(); int W = base.Width / 3; Point p1 = new Point(W, W); Point p2 = new Point(2 * W, W); Point p3 = new Point(2 * W, 2 * W); Point p4 = new Point(W, 2 * W); Point[] pts = { p1, p2, p3, p4 }; startIconPath.AddLines(pts); Brush brush = new SolidBrush(IconColor); g.FillPath(brush, startIconPath); } else { GraphicsPath stopIconPath = new GraphicsPath(); int W = base.Width / 4; Point p1 = new Point(3 * W / 2, W); Point p2 = new Point(3 * W / 2, 3 * W); Point p3 = new Point(3 * W, 2 * W); Point[] pts = { p1, p2, p3, }; stopIconPath.AddLines(pts); Brush brush = new SolidBrush(IconColor); g.FillPath(brush, stopIconPath); } } } /// /// 重新确定控件大小 /// protected void myResize() { int x = DistanceToBorder; int y = DistanceToBorder; int width = this.Width - 2 * DistanceToBorder; int height = this.Height - 2 * DistanceToBorder; rect = new RectangleF(x, y, width, height); } /// /// 绘制高亮效果 /// /// Graphic对象 protected virtual void DrawHighLight(Graphics g) { RectangleF highlightRect = rect; highlightRect.Inflate(-BorderWidth / 2, -BorderWidth / 2); Brush brush = Brushes.DodgerBlue; if (buttonPressed) { brush = new LinearGradientBrush(rect, ButtonCenterColorStart, ButtonCenterColorEnd, GradientAngle); } else { brush = new LinearGradientBrush(rect, Color.FromArgb(60, Color.White), Color.FromArgb(60, Color.White), GradientAngle); } PaintShape(g, brush, highlightRect); } /// /// 绘制边框 /// /// Graphics对象 protected virtual void DrawBorder(Graphics g) { Pen p = new Pen(BorderColor); if (Focused) { p.Color = FocusBorderColor;//外圈获取焦点后的颜色 p.Width = BorderWidth; PaintShape(g, p, rect); } else { p.Width = BorderWidth; PaintShape(g, p, rect); } } /// /// /// /// Graphic对象 protected virtual void DrawPressState(Graphics g) { RectangleF pressedRect = rect; pressedRect.Inflate(-2, -2); Brush brush = new LinearGradientBrush(rect, Color.FromArgb(60, Color.White), Color.FromArgb(60, Color.White), GradientAngle); PaintShape(g, brush, pressedRect); } /// /// 绘制图形 /// /// Graphics对象 /// Pen对象 /// RectangleF对象 protected virtual void PaintShape(Graphics g, Pen pen, RectangleF rect) { g.DrawEllipse(pen, rect); } /// /// 绘制图形 /// /// Graphics对象 /// Brush对象 /// Rectangle对象 protected virtual void PaintShape(Graphics g, Brush brush, RectangleF rect) { g.FillEllipse(brush, rect); } #endregion } }