Create Tracker/Graph Control

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

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

    Create Tracker/Graph Control

    Hallo Community,

    heute mal zu etwas anderem,

    ich soll als Lernprojekt ein UserControl erstellen, welches mir die Ergebnisse aus meinem letzten Thread plottet.

    Also im Endeffekt einen Graphen.

    Ich habe zu vor noch nie ein UserControl entwickelt und suche erstmal einen passenden Einstieg.

    Also z.B.:
    • auf was soll ich Zeichnen (Panel, Picturebox)
    • Worauf muss ich dabei achten
    • Gibt es gute Lektüre dazu ?

    Danke schon mal im Vorraus

    Lg Mausekeks
    Brain is Loading: 35%
    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!
    Hi @RodFromGermany,

    geht es dir Langsam nicht auf die nerven mir die ganze Zeit zu helfen :D

    aber danke für den Link sieht schon einmal sehr vielversprechend aus, jetzt muss ich nur noch ein Steuerelement in die Richtung zaubern.
    Mal hoffen das meine VB Kenntnisse noch nicht so eingerostet sind das ich das ohne den telerik converter hinbekomme :thumbsup:

    Wenn ich fertig bin dann poste ich das hier, wenn du noch irgendwelche Anregungen hast dann gerne per auch PN.

    Vielen Dank :saint: ^^

    LG mausekeks
    Brain is Loading: 35%

    mausekeks schrieb:

    mir die ganze Zeit zu helfen
    Die für mich wichtigen Threads habe ich aboniert, wichtige Posts mit einem Lesezeichen versehen.
    Da muss ich nur überlegen, wie das heißt und schon hast Du Deinen Link. :D
    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!
    Haha oke, dann trotzdem danke :D

    Habe das ganze jetzt in ein Control verpackt:

    Spoiler anzeigen

    C#-Quellcode

    1. public partial class Oszilloskop: UserControl
    2. {
    3. private List<PointF> points;
    4. public List<PointF> Points { get { return points; } set { points = value; } }
    5. public Oszilloskop()
    6. {
    7. InitializeComponent();
    8. points = new List<PointF>();
    9. }
    10. protected override void OnPaint(PaintEventArgs e)
    11. {
    12. Pen penLines = new Pen(Color.LightGray);
    13. GraphicsPath graphics = new GraphicsPath();
    14. #region Variablen
    15. float x1 = 0.0f;
    16. float x2 = this.Width - 1.0f; // Breite des Steuerelements
    17. float y1 = 0.0f;
    18. float y2 = this.Height - 1.0f; // Höhe des Steuerelements
    19. float vert = 10.0f; //Anzahl Vertikaler Linien
    20. float hor = 10.0f; //Anzahl Horizontaler Linien
    21. #endregion
    22. // Vertikale Linien
    23. for (float y = x1; y < x2; y += ((x2 - x1 - 0.001f) / vert))
    24. {
    25. e.Graphics.DrawLine(penLines, y, y1, y, y2);
    26. }
    27. // Horizontale Linien
    28. for (float x = y1; x <= y2; x += ((y2 - y1 - 0.001f) / hor))
    29. {
    30. e.Graphics.DrawLine(penLines, x1, x, x2, x);
    31. }
    32. if (this.points == null || this.points.Count < 10)
    33. {
    34. return;
    35. }
    36. graphics.AddLines(points.ToArray());
    37. RectangleF rect = graphics.GetBounds();
    38. graphics.Warp(this.GetPointsFromRect(),rect);
    39. e.Graphics.DrawPath(Pens.DeepSkyBlue, graphics);
    40. base.OnPaint(e);
    41. }
    42. protected override void OnResize(EventArgs e)
    43. {
    44. this.Invalidate();
    45. }
    46. private PointF[] GetPointsFromRect()
    47. {
    48. var size = this.Size;
    49. return new PointF[] { new PointF(0, 0), new PointF(size.Width - 1, 0), new PointF(0, size.Height - 1) };
    50. }


    Ein paar fragen hätte ich noch dazu.

    du hast in deinem Code ja

    C#-Quellcode

    1. private float coord = 0f;


    und in der zuweisung der punkte hast du

    C#-Quellcode

    1. var t = chart1.Coord / 10;


    teilst du durch 10 wegen der

    C#-Quellcode

    1. if (this.points == null || this.points.Count < 10)
    2. {
    3. return;
    4. }


    Und ansonsten habe ich noch eine frage betreffend des Zeichnens:

    Wenn man kontinuierlich Daten in das Control lädt flackert es, wahrscheinlich wegen der Neuzeichnung (oder?).
    Gibt es einen weg das flackern zu vermeiden?


    LG

    Vollzitat entfernt. ~Thunderbolt
    Brain is Loading: 35%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Es gibt die Eigenschaft DoubleBuffered (msdn). Diese vermeidet in den meisten Fällen das Flackern.
    Setz diese beim Erstellen auf True und es sollte funktionieren.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Gather danke für die Info

    hättest du evtl noch ein paar tips und tricks was das ganze angeht, habe zuvor noch nie sowas gemacht, und ich bin ehrlich gesagt absoluter fan deiner Controls.

    Vollzitat entfernt. ~Thunderbolt
    Brain is Loading: 35%

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Ich mache das Ganze beim Erstellen eines Controls einfach immer wie folgt:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Ein Button-Steuerelement im Metrostil.
    3. ''' </summary>
    4. <System.Drawing.ToolboxBitmap(GetType(Button))>
    5. <DefaultEvent("Click")>
    6. <DesignerCategory("Code")>
    7. <Description("Ein MetroButton-Steuerelement im Metrostil.")>
    8. Public Class MetroButton : Inherits Control
    9. ''' <summary>
    10. ''' Erstellt ein neues Button-Steuerelement im Metrostil.
    11. ''' </summary>
    12. Sub New()
    13. Font = New Font("Segoe UI", 9)
    14. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.SupportsTransparentBackColor, True)
    15. BackColor = Color.Transparent
    16. UpdateStyles()
    17. End Sub
    18. ' ...


    Eine Sub New welche beim Erstellen des Controls automatisch aufgerufen wird. Hier werden bestimmte vordefinierte Eigenschaften gesetzt wie,
    wie man oben sieht, der OptimizedDoubleBuffer. Allerdingst kannst du dir das Ganze auch ersparen und einfach in der Sub New, DoubleBuffered = True; setzen.
    Ist alles vb.net sollte sich aber einfach übersetzen lassen.


    Edit:// das mit dem Fan hört man gerne :)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Gather danke für die Tipps,

    ich hatte eigentlich gehofft da käme evtl. noch etwas aus der Richtung wie man so einen Graphen besser aufbaut, da du ja schon Erfahrung mit dem MetroTracker hast etc.
    Ist wohl Berufsgeheimnis haha :D

    Und ja habe schon einige Projekte sowohl mit der ChartLib als auch dem Metroframework gemacht, also nochmal großes Lob an dich
    Bin gespannt auf die dinge die da vlt noch kommen

    LG Mausekeks
    Brain is Loading: 35%

    mausekeks schrieb:

    Wenn man kontinuierlich Daten in das Control lädt flackert es, wahrscheinlich wegen der Neuzeichnung (oder?).
    Ausprobieren und fragen, wenn es flackert.
    Bei mir ist .DoubleBuffered = False.
    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!