using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CPM.ProgressBar { public class LV_CIRCULEPROGRESSBAR : UserControl { private int _valor = 0; private int _maximo = 100; private int _larguraBorda = 10; private Color _corProgresso = Color.FromArgb(0, 120, 215); private Color _corFundo = Color.LightGray; private Font _fonteTexto = new Font("Segoe UI", 10, FontStyle.Bold); private bool _mostrarPorcentagem = true; [Category("Comportamento")] public int Valor { get => _valor; set { _valor = Math.Min(_maximo, Math.Max(0, value)); Invalidate(); } } [Category("Comportamento")] public int Maximo { get => _maximo; set { _maximo = value <= 0 ? 1 : value; Invalidate(); } } [Category("Aparência")] public int LarguraBorda { get => _larguraBorda; set { _larguraBorda = Math.Max(1, value); Invalidate(); } } [Category("Aparência")] public Color CorProgresso { get => _corProgresso; set { _corProgresso = value; Invalidate(); } } [Category("Aparência")] public Color CorFundo { get => _corFundo; set { _corFundo = value; Invalidate(); } } [Category("Aparência")] public Font FonteTexto { get => _fonteTexto; set { _fonteTexto = value; Invalidate(); } } [Category("Aparência")] public bool MostrarPorcentagem { get => _mostrarPorcentagem; set { _mostrarPorcentagem = value; Invalidate(); } } public LV_CIRCULEPROGRESSBAR() { DoubleBuffered = true; ResizeRedraw = true; Size = new Size(150, 150); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; Rectangle rect = new Rectangle(_larguraBorda, _larguraBorda, Width - _larguraBorda * 2, Height - _larguraBorda * 2); using (Pen fundoPen = new Pen(_corFundo, _larguraBorda)) using (Pen progressoPen = new Pen(_corProgresso, _larguraBorda)) { progressoPen.StartCap = LineCap.Round; progressoPen.EndCap = LineCap.Round; // Fundo e.Graphics.DrawArc(fundoPen, rect, -90, 360); // Progresso float angulo = 360f * _valor / _maximo; e.Graphics.DrawArc(progressoPen, rect, -90, angulo); } if (_mostrarPorcentagem) { string texto = $"{(int)((double)_valor / _maximo * 100)}%"; SizeF tamanhoTexto = e.Graphics.MeasureString(texto, _fonteTexto); e.Graphics.DrawString(texto, _fonteTexto, new SolidBrush(Color.White), (Width - tamanhoTexto.Width) / 2, (Height - tamanhoTexto.Height) / 2); } } } }