LevelOS/Components/ProgressBar/LV-CIRCULEPROGRESSBAR.cs

138 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
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);
}
}
}
}