Gezeichneter Kreis vergrößert sich nach Klick

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Gezeichneter Kreis vergrößert sich nach Klick

    Hallo, ich hätte da mal eine Frage bezüglich meines selbstgebauten Controls in C#.

    Ich versuche derzeit mir eine eigene ProgressBar zu basteln, die in einem Kreis dargestellt wird.
    Im Anhang befinden sich die Bilder, Screenshot_7 ist der Entwurf im Visual Studio, wo ja alles noch in Ordnung aussieht.
    Sobald ich aber Debugge und einmal auf den Button klicke, vergrößert sich der Kreis und die Ränder werden abgeschnitten, verstehe aber nicht wieso.

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace customProgressBar
    11. {
    12. public partial class pgBar : System.Windows.Forms.ProgressBar
    13. {
    14. public pgBar()
    15. {
    16. InitializeComponent();
    17. this.SetStyle(ControlStyles.UserPaint, true);
    18. }
    19. protected override void OnResize(EventArgs e)
    20. {
    21. this.Invalidate();
    22. }
    23. private void DrawProgress(Graphics g, float percentage)
    24. {
    25. dynamic progressAngle = Convert.ToSingle(360 / 100 * percentage);
    26. dynamic remainderAngle = 360 - progressAngle;
    27. using (Pen progressPen = new Pen(Color.Black, 5))
    28. {
    29. progressPen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
    30. using (Pen remainderPen = new Pen(Color.LightGray, 5))
    31. {
    32. remainderPen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;
    33. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    34. g.DrawArc(progressPen, this.ClientRectangle , 90 - (progressAngle / 2), progressAngle);
    35. g.DrawArc(remainderPen, this.ClientRectangle, progressAngle + (90 - (progressAngle / 2)), remainderAngle);
    36. }
    37. }
    38. }
    39. protected override void OnPaint(PaintEventArgs e)
    40. {
    41. DrawProgress(e.Graphics, (float)Value);
    42. }
    43. }
    44. }


    Jemand vielleicht eine Idee diesbezüglich oder eventuell eine Referenz wo ich was nachlesen kann?


    lg
    TehBasic
    Bilder
    • Screenshot_7.png

      4,74 kB, 301×386, 25 mal angesehen
    • Screenshot_8.png

      6,23 kB, 314×400, 27 mal angesehen
    @TehBasic Die ProgressBar als solche ist ein etwas blödes Contrrol.
    Vielleicht verzichtest Du auf sie als Masisklasse und ziehst Dir die paar Eigenschaften noch rüber und machst das in sich rund.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @TehBasic Die ProgressBar als solche ist ein etwas blödes Contrrol.
    Vielleicht verzichtest Du auf sie als Masisklasse und ziehst Dir die paar Eigenschaften noch rüber und machst das in sich rund.


    Interessehalber: Wieso denn? Würde mich echt interessieren.


    @On-Topic:
    Falls irgendwer, irgendwann einmal hierbei stecken bleibt, hier meine Lösung:
    Dem Kreis einfach eine etwas kleinere Fläche zum zeichnen geben und dann ist das Problem auch schon gelöst, werden die Ecken nicht abgeschnitten.

    C#-Quellcode

    1. g.DrawArc(progressPen, 2, 2, this.ClientRectangle.Width - 5, this.ClientRectangle.Height - 5, 90 - (progressAngle / 2), progressAngle);
    2. g.DrawArc(remainderPen, 2, 2, this.ClientRectangle.Width - 5, this.ClientRectangle.Height - 5, progressAngle + (90 - (progressAngle / 2)), remainderAngle);


    Das der Kreis ein bisschen größer wurde nach dem OnPaint-Event lag an folgendem:

    C#-Quellcode

    1. ​ remainderPen.Alignment = System.Drawing.Drawing2D.PenAlignment.Inset;

    TehBasic schrieb:

    Wieso denn?
    Das ist das Geheimnis von Bill. :/
    Such mal nach Ownerdraw ProgressBar, da bekommst Du ein Gefühl dafür, was so nicht geht.
    Sinnigerweise ist eine Ownerdraw ProgressBar wohl das UserControls, das von den meisten Programmieranfängern angegangen wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!