Une autre ProgressBar circulaire facile
Toujours dans en recherche de progress bar circulaire, j'ai essayé de faire la même chose mais en WinForms.
J'avais trouvé un composant très pratique, très complet, et très justement nommé CircluarProgressBar, par Soroush Falahati sur GitHub. et je vous conseille d'y jeter un oeil, il est facile d'utilisation et offre vraiment de nombreuses options de configuration.
Cependant, pour mon usage, il est beaucoup trop compliqué. J'ai seulement besoin d'un camembert qui disparait au fur et à mesure que le timer de mon code TOTP s'écoule.
Mon problème, c'est que je suis quand même une buse en programmation... Donc j'ai eu du mal à trouver que ce que je cherchais existait nativement dans les bibliothèques standards. Et cela s'appelle tout simplement FillPie.
Il existe plusieurs surcharges de cette méthode, mais en gros, elle a besoin d'une brush (d'une couleur quoi), d'un point de départ et d'arrivée ou d'un rectangle graphique, et d'angles de départ et d'arrivée (starAngle et sweepAngle).
Dans mon cas, ce camembert sera dessiné dans un panel, donc le context graphique et le rectangle de dessin sont tout trouvés (panel1.Graphics()
et panel1.DisplayRectangle
). L'angle de départ est fixé à -90° (à la verticale, en haut), et le sweepAngle est calculé en fonction du progrès à afficher.
Dans l'ensemble, ça me donne ça:
private void DrawPie(Panel parent, float progress, float angleShift = -90f)
{
parent.SuspendLayout();
// Create pen.
SolidBrush brush = new SolidBrush(Color.SteelBlue);
// Make sure it fits in the parent with a 1 pixel margin
Rectangle rect = parent.DisplayRectangle;
rect.Width = Math.Min(rect.Width, rect.Height);
rect.Height = Math.Min(rect.Width, rect.Height);
rect.Width = rect.Width - 1;
rect.Height = rect.Height - 1;
// Create start and sweep angles.
float startAngle = angleShift;
float sweepAngle = progress * 360f;
Debug.WriteLine(sweepAngle + " " + rect.X + " " + rect.Y + " " + rect.Width + " " + rect.Height);
// Draw pie to screen.
parent.Refresh();
var graphics = parent.CreateGraphics();
// Make it smooth, otherwise it's really aliased a lot!
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.FillPie(brush, rect, startAngle, sweepAngle);
parent.ResumeLayout();
}
et on l'appelle comme ça:
DrawPie(panel1, (float)_totp.Remaining / (float)_totp.Step);
Le panel est le parent, et le progress est un float entre 0 et1.
Et pour moi, ca me suffit, et ca ressemble pas mal à la version WPF dont j'ai déjà parlé.
@+
Ajouter un commentaire