GDI - Form Paint Event - Gezeichnetes Löschen

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    GDI - Form Paint Event - Gezeichnetes Löschen

    Hallo,

    ich hab da ein kleines Problem und ich bin mir fast sicher das es nicht zu lösen ist :pinch:
    Ich zeichne mit GDI etwas im Form Paint Event direkt auf die Form.
    Und 1/8 Sekunde später zeichne ich es wieder neu das gleiche nur woanders...

    Nur da nach 10 Sekunde die Form voll mit gezeichneten ist obwohl es nur einmal da sein soll dachte ich mir hey .Clear(ste) mal..
    Doch dann wird alles gelöscht so auch das Background Image das da bleiben soll..
    Wenn ich jetzt nach dem .Clear das Background Image neu lade fängt alles an tierisch zu flimmern.
    (Auch mit Double Buffer was ja verständlich ist)

    Gibt es eine Möglichkeit nur das gezeichnete zu löschen?
    Doch ich muss sagen es muss auf der Form gezeichnet werden nicht in einer neue Bitmap oder sowas.
    Nicht möglich oder?

    Gruß Eistee
    Ok dachte ich würde es mit Invalidate aufrufen :pinch: hatte ich wohl vergessen.. :whistling:
    So klappt es halb


    Ist der Double Buffer AN
    Wird die Kurve sofort übermalt (denke mal vom Background Image)

    Ist der Double Buffer AUS
    Flackert es weiß Im Form Paint Ereigniss steht nur:
    Zeichner.DrawCurve(Stift_Schwarz, KurvenArray_S, Tension)


    Irgentwie blöd das beim Double Buffer'n anscheint zuerst die Kurve gemalt wird
    und dann das Background Image was die blöde Kurve überkritzelt :cursing:
    Also ich zeichne sowas eigentlich meistens auf Bitmaps (auch wenn du das nich willst). Dabei gibt es dann für jede "Zeichenebene" ein separates Bitmap. Im Paint werden die Bitmaps dann in der gewünschten Reihenfolge auf die Form gepinselt. Das funzt in der Regel problemlos. :)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Ich frag mich blos warum der mist nicht geht
    (Ich weiß ich hab wohl den Fehler verursacht nicht der Pc <- Normal xD)

    Meine jetzige Strucktur ist so:

    VB.NET-Quellcode

    1. Sub Scrollbar.Scroll
    2. Call Berechnen
    3. End Sub
    4. Sub Berechnen
    5. x=x+y+z
    6. Form1.Invalidate()
    7. End Sub
    8. Sub Form1_Paint
    9. Zeichner.DrawCurve(Stift_Orange, KurvenArray_E, Tension)
    10. End Sub
    11. 'Double Buffer ist an


    Doch die Kurve wird nicht gezeichnet!
    (eig. schon flackert eine millisekunde lang auf wenn ich schnell scrolle ist aber ist aber nach dem scrollen wieder weg übermalt..)
    Erst wennich z.B. mit der maus über einen button fahre oder die
    größe der Form ändere was ja zum neuzeichnen führt ist die Kurve da.

    Das ist schon ne sache für sich xD
    Meinst du damit nur:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. Me.SetScrollState(ControlStyles.DoubleBuffer, True)
    3. End Sub


    Oder soll ich da noch etwas einstellen?
    Weil das alleine hat nichts geändert.
    Lol oben der übelste Intelisense Fail :D

    VB.NET-Quellcode

    1. Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
    2. Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
    3. Me.SetStyle(ControlStyles.UserPaint, True)


    Leider ohne änderung.
    Ich versteh es einfach nicht es ging doch sonst immer ich zeiche doch nur eine linie :(
    Offensichtlich ist es aber nach deiner Beschreibung so, dass das Paint-Event mit Form1.Invalidate() nicht aufgerufen wird (kannst ja mit Haltepunkt prüfen).
    Wenn deine Berechnung im Modul steckt, rufst du sie ja irgendwo mal aus der Form heraus auf. Setz doch dein Invalidate versuchsweise mal hinter diesen Aufruf.
    Kann sein, dass ich irre, aber ich denke immer noch, dass es daran liegt, dass Form1 keine Instanz ist sondern die Klasse... Da weis Jvbl aber vielleicht näheres.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Form1

    VB.NET-Quellcode

    1. Private Sub Stärke_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles Stärke.Scroll
    2. Dim StärkeStandart As Integer = 400
    3. xxxxxxx.Location = New Point(xxxxxx.Location.X, StärkeStandart + Stärke.Value)
    4. Call Module1.Kurve_Berechnen(New Point(400, 400), Stärke.Value * 2, Winkel.Value)
    5. 'Me.Invalidate() <-- Probiert kein Unterschied ist jetzt wieder raus..
    6. End Sub
    7. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    8. Zeichner.DrawCurve(Stift_Orange, KurvenArray_E, Tension)
    9. Zeichner.FillPie(Brushes.Green, Punkt1_E.X - 5, Punkt1_E.Y - 5, 10, 10, 0, 360)
    10. Zeichner.FillPie(Brushes.Green, Punkt2_E.X - 5, Punkt2_E.Y - 5, 10, 10, 0, 360)
    11. Zeichner.FillPie(Brushes.Green, Punkt3_E.X - 5, Punkt3_E.Y - 5, 10, 10, 0, 360)
    12. Zeichner.FillPie(Brushes.Green, Punkt4_E.X - 5, Punkt4_E.Y - 5, 10, 10, 0, 360)
    13. Zeichner.FillPie(Brushes.Green, Punkt5_E.X - 5, Punkt5_E.Y - 5, 10, 10, 0, 360)
    14. Zeichner.FillPie(Brushes.Red, Ende_E.X - 5, Ende_E.Y - 5, 10, 10, 0, 360)
    15. End Sub


    Modul

    VB.NET-Quellcode

    1. Public Sub Kurve_Berechnen(ByRef Anfang_E As Point, ByRef Radius_E As Double, ByRef Winkel_Value As Double)
    2. 'Lange Berechnung mehrerer Arrays unwichtig da die richtige Kurve(also richtige werte/position) ab und zu aufflackert..
    3. Form1.Invalidate()
    4. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Eistee“ ()