Clear-Befehl

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Clear-Befehl

    Es geht um diese Draw Funktion, es werden im Prinzip 3 komplexe Zeiger gezeichnet, wenn ein Knopf gedrückt wird.
    Hierbei ist das Bild "imageedit_6_938613601" ein Koordinatensystem. Mein Problem ist, dass

    VB.NET-Quellcode

    1. grfx.clear(me.BackColor)
    die vorherige Zeichnung löscht,
    was es auch soll, jedoch wird auch das Hintergrundbild gelöscht.

    VB.NET-Quellcode

    1. Me.BackgroundImage = My.Resources.imageedit_6_9386136010
    Sollte dies verhindern.
    Jedoch überschreibt dieser Befehl die Zeichnung die danach eigentlich erst kommt. Hat einer eine Idee wie man das lösen kann?

    VB.NET-Quellcode

    1. Private Sub Draw()
    2. Dim grfx As Graphics = Me.CreateGraphics
    3. grfx.Clear(Me.BackColor)
    4. Me.BackgroundImage = My.Resources.imageedit_6_9386136010
    5. If Not m_PhaseSystem Is Nothing Then
    6. Dim ScaleFactorPercent = m_ScaleFactor / 100
    7. Dim i As Integer = 124 + PhaseSystem.L1.real * ScaleFactorPercent
    8. Dim k As Integer = 129 + PhaseSystem.L1.imaginär * -1 * ScaleFactorPercent
    9. grfx.DrawLine(Pens.Green, 124, 129, i, k)
    10. grfx.DrawString("Phase 1", New Font("Arial", 12), Brushes.Green, 1, 1)
    11. Dim g As Integer = 124 + PhaseSystem.L2.real * ScaleFactorPercent
    12. Dim h As Integer = 129 + PhaseSystem.L2.imaginär * -1 * ScaleFactorPercent
    13. grfx.DrawLine(Pens.Red, 124, 129, g, h)
    14. grfx.DrawString("Phase 2", New Font("Arial", 12), Brushes.Red, 1, 16)
    15. Dim m As Integer = 124 + PhaseSystem.L3.real * ScaleFactorPercent
    16. Dim n As Integer = 129 + PhaseSystem.L3.imaginär * -1 * ScaleFactorPercent
    17. grfx.DrawLine(Pens.Blue, 124, 129, m, n)
    18. grfx.DrawString("Phase 3", New Font("Arial", 12), Brushes.Blue, 1, 31)
    19. End If


    Ich habe schon einen Thread gesehen der dieses Thema anspricht, jedoch konnte ich dessen Lösung bei mir nicht verwenden.

    MfG Akoo

    Verschoben. ~Thunderbolt

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

    @akoo Willkommen im Forum. :thumbup:
    Zunächst musst Du wissen, dass es nur einen Pixel-Buffer für den angezeigten Inhalt gibt. Du gehst wohl davon aus, dass es zum Hintergrundbild Overlays gibt, die einzeln behandelt werden können.
    Das gibt es in WinForms nicht, da kommt alles nacheinander in denselben Speicher.
    Statt des Löschens mit .Clear(col) male doch direkt das Hintergrundbild in das Bild.
    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!
    Danke für die schnelle Antwort!
    Gibt es da keine andere Möglichkeit?
    Ich habe von Funktionen wie Me.Invalidate() oder irgendwas von Paint-Event gelesen wüsste aber nicht wie ich die einsetze.
    Das Koordinatensystem ist etwas kompliziert und nicht einfach zu zeichnen, deswegen würde ich das Bild als Hintergrund bevorzugen.
    @akoo Bei .Invalidate(...) (achte auf die Überladungen :!: ) wird ein Teil der Bildfläche markiert, der bei der nächsten Ausführung des Paint-Befehls in Folge eines vom Framework gesendeten Paint-Events neu gemalt wird.
    Im Paint-Befehl wird die Bildfläche vollständig gemalt, was dargestellt wird, kannst Du von außen steuern.
    Vielleicht beschreibst Du mal, was Du ühaupt vorhast, da lässt sich gewiss besser helfen.
    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!
    Das Problem ist wenn ich oben

    VB.NET-Quellcode

    1. grfx.Clear(Me.BackColor)
    weg lasse zeichnet das Programm immer weitere Zeiger, wenn ich neue Werte Angebe, löscht er nicht die alten Linien. Er sollen nur 3 Zeiger dargestellt werden.
    Mit dem clear befehl, werden diese gelöscht, jedoch auch das Hintergrundbild.
    Mein Vorhaben ist nun das der Draw-Befehl nur die neuen Zeiger zeichnen soll und die alten Gelöscht werden ohne, dass das Hintergrundbild gelöscht wird.
    @akoo Statt .Clear() Du sollst Du das Hintergrundbild malen.
    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!
    nach meiner Erfahrung braucht man weder Clearen, noch Hintergrund selbst malen.
    Lass das Controls seinen Hintergrund malen - ist doch gut.
    Da drauf dann die eigenen Zeichnungen anbringen.
    Allerdings ist Me.CreateGraphics bereits die Todsünde.
    OwnerDrawing darf nur im Paint-Event stattfinden - und dort bekommt man das zu benutzende Graphics-Objekt geliefert.

    Also erste Aufgabe an @akoo: Behandle das Paint-Event, und zeig uns dann den Code davon.

    Weitere Fragen:
    • Benötigst du erst noch zu lernen, ein Event zu behandeln?
    • Möchtest du ein umfassendes Tut zum Thema Ownerdrawing?