WinForm中的圆环
创建类之后复制下面的代码 然后重新生成就可以使用了
圆环代码如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Ring
{public class CircularProgress : Control{private int _value = 0;private int _maximum = 100;private int _ringWidth = 20;private Color _ringColor = Color.FromArgb(0, 120, 215);private Color _ringBackColor = Color.FromArgb(240, 240, 240);private Color _backgroundColor = Color.White;private bool _showText = true;private string _textFormat = "{0}%";private Font _textFont;private Color _textColor = Color.FromArgb(64, 64, 64);private bool _showShadow = true;private Color _shadowColor = Color.FromArgb(100, 0, 0, 0);private int _shadowOffset = 2;private float _startAngle = 270f;private bool _useGradient = true;private Color _gradientColor = Color.Empty;private bool _showGlow = true;private int _glowSize = 5;public CircularProgress(){this.DoubleBuffered = true;this.Size = new Size(200, 200);this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint |ControlStyles.ResizeRedraw |ControlStyles.OptimizedDoubleBuffer, true);_textFont = new Font("Segoe UI", 12, FontStyle.Bold);}// 基本属性public int Value{get { return _value; }set{_value = Math.Max(0, Math.Min(_maximum, value));this.Invalidate();}}public int Maximum{get { return _maximum; }set{_maximum = Math.Max(1, value);_value = Math.Min(_value, _maximum);this.Invalidate();}}public int RingWidth{get { return _ringWidth; }set{_ringWidth = Math.Max(1, value);this.Invalidate();}}public Color RingColor{get { return _ringColor; }set{_ringColor = value;this.Invalidate();}}public Color RingBackColor{get { return _ringBackColor; }set{_ringBackColor = value;this.Invalidate();}}public Color BackgroundColor{get { return _backgroundColor; }set{_backgroundColor = value;this.Invalidate();}}// 文本相关属性public bool ShowText{get { return _showText; }set{_showText = value;this.Invalidate();}}public string TextFormat{get { return _textFormat; }set{_textFormat = value;this.Invalidate();}}public Font TextFont{get { return _textFont; }set{_textFont = value;this.Invalidate();}}public Color TextColor{get { return _textColor; }set{_textColor = value;this.Invalidate();}}// 效果属性public bool ShowShadow{get { return _showShadow; }set{_showShadow = value;this.Invalidate();}}public float StartAngle{get { return _startAngle; }set{_startAngle = value;this.Invalidate();}}public bool UseGradient{get { return _useGradient; }set{_useGradient = value;this.Invalidate();}}public Color GradientColor{get { return _gradientColor; }set{_gradientColor = value;this.Invalidate();}}public bool ShowGlow{get { return _showGlow; }set{_showGlow = value;this.Invalidate();}}public int GlowSize{get { return _glowSize; }set{_glowSize = Math.Max(0, value);this.Invalidate();}}// 预设颜色主题public void ApplyColorScheme(ColorScheme scheme){switch (scheme){case ColorScheme.Blue:SetColors(Color.FromArgb(0, 120, 215), Color.FromArgb(64, 156, 255), Color.FromArgb(0, 90, 158));break;case ColorScheme.Green:SetColors(Color.FromArgb(46, 204, 113), Color.FromArgb(88, 214, 141), Color.FromArgb(39, 174, 96));break;case ColorScheme.Red:SetColors(Color.FromArgb(231, 76, 60), Color.FromArgb(236, 112, 99), Color.FromArgb(192, 57, 43));break;case ColorScheme.Purple:SetColors(Color.FromArgb(155, 89, 182), Color.FromArgb(175, 122, 197), Color.FromArgb(142, 68, 173));break;case ColorScheme.Orange:SetColors(Color.FromArgb(230, 126, 34), Color.FromArgb(235, 151, 78), Color.FromArgb(211, 84, 0));break;case ColorScheme.Teal:SetColors(Color.FromArgb(22, 160, 133), Color.FromArgb(72, 201, 176), Color.FromArgb(19, 141, 117));break;case ColorScheme.Pink:SetColors(Color.FromArgb(255, 107, 129), Color.FromArgb(255, 148, 164), Color.FromArgb(255, 71, 97));break;case ColorScheme.Gold:SetColors(Color.FromArgb(241, 196, 15), Color.FromArgb(245, 215, 110), Color.FromArgb(213, 172, 13));break;case ColorScheme.Cyan:SetColors(Color.FromArgb(0, 188, 212), Color.FromArgb(77, 208, 225), Color.FromArgb(0, 151, 167));break;case ColorScheme.Indigo:SetColors(Color.FromArgb(63, 81, 181), Color.FromArgb(106, 120, 205), Color.FromArgb(48, 63, 159));break;case ColorScheme.Sunset:SetColors(Color.FromArgb(255, 94, 77), Color.FromArgb(255, 145, 114), Color.FromArgb(255, 61, 38));_gradientColor = Color.FromArgb(255, 193, 7);break;case ColorScheme.Ocean:SetColors(Color.FromArgb(0, 150, 199), Color.FromArgb(77, 184, 214), Color.FromArgb(0, 119, 190));_gradientColor = Color.FromArgb(0, 180, 216);break;case ColorScheme.Forest:SetColors(Color.FromArgb(56, 142, 60), Color.FromArgb(102, 187, 106), Color.FromArgb(46, 125, 50));break;case ColorScheme.Lavender:SetColors(Color.FromArgb(179, 157, 219), Color.FromArgb(204, 191, 231), Color.FromArgb(149, 125, 173));break;case ColorScheme.Coral:SetColors(Color.FromArgb(255, 138, 101), Color.FromArgb(255, 173, 148), Color.FromArgb(255, 112, 67));break;}}private void SetColors(Color ringColor, Color gradientColor, Color textColor){_ringColor = ringColor;_gradientColor = gradientColor;_textColor = textColor;this.Invalidate();}protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g = e.Graphics;g.SmoothingMode = SmoothingMode.AntiAlias;g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;g.PixelOffsetMode = PixelOffsetMode.HighQuality;// 绘制背景(圆角矩形)using (GraphicsPath path = CreateRoundRectPath(this.ClientRectangle, 15))using (SolidBrush backBrush = new SolidBrush(_backgroundColor)){g.FillPath(backBrush, path);using (Pen borderPen = new Pen(Color.FromArgb(200, 200, 200), 1)){g.DrawPath(borderPen, path);}}// 计算圆环的矩形区域int padding = 10 + _glowSize;int ringDiameter = Math.Min(this.Width, this.Height) - (padding * 2);int x = (this.Width - ringDiameter) / 2;int y = (this.Height - ringDiameter) / 2;Rectangle rect = new Rectangle(x, y, ringDiameter, ringDiameter);// 调整圆环矩形int ringPadding = _ringWidth / 2 + 2;Rectangle ringRect = new Rectangle(rect.X + ringPadding,rect.Y + ringPadding,rect.Width - ringPadding * 2,rect.Height - ringPadding * 2);// 绘制发光效果if (_showGlow && _value > 0){DrawGlowEffect(g, ringRect);}// 绘制圆环底色using (Pen backPen = new Pen(_ringBackColor, _ringWidth)){backPen.StartCap = LineCap.Round;backPen.EndCap = LineCap.Round;g.DrawArc(backPen, ringRect, 0, 360);}// 绘制进度圆环if (_value > 0){using (Pen progressPen = CreateProgressPen(ringRect)){float angle = 360f * _value / _maximum;g.DrawArc(progressPen, ringRect, _startAngle, angle);}}// 绘制中心文本if (_showText){DrawCenterText(g, ringDiameter);}}private Pen CreateProgressPen(Rectangle ringRect){Pen progressPen = new Pen(_ringColor, _ringWidth);progressPen.StartCap = LineCap.Round;progressPen.EndCap = LineCap.Round;if (_useGradient && ringRect.Width > 50){Color gradientEnd = _gradientColor.IsEmpty ?ControlPaint.Light(_ringColor, 0.3f) : _gradientColor;using (var brush = new LinearGradientBrush(new Point(ringRect.Left, ringRect.Top),new Point(ringRect.Right, ringRect.Bottom),_ringColor,gradientEnd)){progressPen.Brush = brush;}}return progressPen;}private void DrawGlowEffect(Graphics g, Rectangle ringRect){for (int i = _glowSize; i > 0; i--){using (Pen glowPen = new Pen(Color.FromArgb(30 - i * 5, _ringColor), _ringWidth + i * 2)){glowPen.StartCap = LineCap.Round;glowPen.EndCap = LineCap.Round;float angle = 360f * _value / _maximum;g.DrawArc(glowPen, ringRect, _startAngle, angle);}}}private void DrawCenterText(Graphics g, int ringDiameter){string text = string.Format(_textFormat, _value);float fontSize = Math.Max(8, ringDiameter / 8f);using (Font font = new Font(_textFont.FontFamily, fontSize, _textFont.Style))using (SolidBrush textBrush = new SolidBrush(_textColor)){SizeF textSize = g.MeasureString(text, font);PointF textLocation = new PointF((this.Width - textSize.Width) / 2,(this.Height - textSize.Height) / 2);if (_showShadow){using (SolidBrush shadowBrush = new SolidBrush(_shadowColor)){g.DrawString(text, font, shadowBrush,textLocation.X + _shadowOffset,textLocation.Y + _shadowOffset);}}g.DrawString(text, font, textBrush, textLocation);}}private GraphicsPath CreateRoundRectPath(Rectangle rect, int radius){GraphicsPath path = new GraphicsPath();path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);path.AddArc(rect.X + rect.Width - radius, rect.Y, radius, radius, 270, 90);path.AddArc(rect.X + rect.Width - radius, rect.Y + rect.Height - radius,radius, radius, 0, 90);path.AddArc(rect.X, rect.Y + rect.Height - radius, radius, radius, 90, 90);path.CloseFigure();return path;}protected override void OnResize(EventArgs e){base.OnResize(e);this.Invalidate();}protected override void Dispose(bool disposing){if (disposing && _textFont != null){_textFont.Dispose();}base.Dispose(disposing);}}// 颜色主题枚举public enum ColorScheme{Blue,Green,Red,Purple,Orange,Teal,Pink,Gold,Cyan,Indigo,Sunset,Ocean,Forest,Lavender,Coral}}