Picturebox, Linie gezeichnet und wieder löschen

  • VB.NET

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

    Picturebox, Linie gezeichnet und wieder löschen

    Hallo :)

    Habe mir diesem Code:

    VB.NET-Quellcode

    1. Dim g As Graphics = PictureBox1.CreateGraphics()
    2. 'g.DrawLine(Pens.Gray, x1, y1, x2, y2)
    3. g.DrawLine(Pens.Gray, y, 0, y, 165)
    eine Linie in eine Picturebox gezeichnet.

    Gibt es eine Möglichkeit diese Linie wieder zu entfernen ? Eine Art Undo-Funktion ?


    Viele Grüße
    Michl
    Oder indem du die Linie einfach mit der Hintergrundfarbe der Picturebox nachzeichnest funktioniert nur wenn die Linie von keiner gekreutzt wird.
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mokki“ ()

    michl75 schrieb:

    Undo-Funktion
    Wisse, was gezeichnet wird, wisse, was nicht gezeichnet werden soll, invalidisiere die Form / PictureBox und zeichne sie neu.
    Mit Flags steuerst Du, was im jeweiligen Paint-Event gezeichnet werden soll:

    VB.NET-Quellcode

    1. If flagLine Then
    2. g.DrawLine(Pens.Gray, y, 0, y, 165)
    3. End If
    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!
    ok ok ok :) langsam... damit ich es verstehe...

    erst mal versuche ich es mal so und wills verstehen ... was wieso warum...

    Problem ist bei meinem Code, dass war das Image eingezeichnet wird, die Linien kurz aufleuchten und dann sofort wieder verschwinden... und ich kann es mir nicht erklären warum !?

    Code

    VB.NET-Quellcode

    1. Private Sub Druckereinstellung_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. txb_rabdoben.Text = My.Settings.Pgm_Eins_Druck_RandOben
    3. txb_randlinks.Text = My.Settings.Pgm_Eins_Druck_RandLinks
    4. X()
    5. End Sub
    6. Private Sub x()
    7. PictureBox1.Image = My.Resources.SanKalk_Briefbogen_1
    8. RaenderZeichnen()
    9. End Sub
    10. Private Sub txb_rabdoben_TextChanged(sender As System.Object, e As System.EventArgs) Handles txb_rabdoben.LostFocus
    11. x()
    12. End Sub
    13. Private Sub txb_randlinks_TextChanged(sender As System.Object, e As System.EventArgs) Handles txb_randlinks.LostFocus
    14. x()
    15. End Sub
    16. Private Sub RaenderZeichnen()
    17. Dim g As Graphics = PictureBox1.CreateGraphics()
    18. If txb_rabdoben.Text = Nothing Then
    19. Exit Sub
    20. Else
    21. Dim x As Integer = Math.Round(CDbl(txb_rabdoben.Text) / 18, 0)
    22. g.DrawLine(New Pen(System.Drawing.Color.Red, 1), 0, x, 115, x)
    23. End If
    24. If txb_randlinks.Text = Nothing Then
    25. Exit Sub
    26. Else
    27. Dim y As Integer = Math.Round(CDbl(txb_randlinks.Text) / 18, 0)
    28. g.DrawLine(New Pen(System.Drawing.Color.Red, 1), y, 0, y, 164)
    29. End If
    30. End Sub
    WEil du nicht zuhörst ^^
    .CreateGraphics weg! Nutze e.Graphics undzwar im PaintEventHandler der Form. Wichtig dabei: Das PaintEvent (und somit auch deine Mehtode) wird immer ausgelöst, wenn der Sender (deine Form) neugezeichnet werden muss.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Also was er sagen will:

    PictureBoxes haben ein Event "Paint". Nimm den Code aus deinem "RaenderZeichnen()" Sub und füge ihn dieses Event ein.
    Dann musst du noch statt "PictureBox1.CreateGraphics()" "e.Graphics" nehmen und deine Ränder müssten gezeichnet werden.
    Falls du nun explizit die Ränder zeichnen möchtest kannst du dazu den Sub "PictureBox1_Paint" (mit entsprechenden Parametern)
    oder so etwas wie "PictureBox1.Invalidate()" aufrufen
    danke habs kapiert ! :)

    Sorry, bin heute bisserl langsam :)


    nochmals danke !!

    VB.NET-Quellcode

    1. Private Sub txb_rabdoben_TextChanged(sender As System.Object, e As System.EventArgs) Handles txb_ranboben.LostFocus
    2. PictureBox1.Invalidate()
    3. End Sub
    4. Private Sub txb_randlinks_TextChanged(sender As System.Object, e As System.EventArgs) Handles txb_randlinks.LostFocus
    5. PictureBox1.Invalidate()
    6. End Sub
    7. Private Sub PictureBox1_Paint(ByVal sender As System.Object, _
    8. ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    9. Dim x As Integer = 1
    10. Dim y As Integer = 1
    11. Dim img As Image
    12. If My.Settings.Pgm_Eins_Druck_Code = sZahl Then
    13. If My.Settings.Pgm_Eins_Druck_PfadPapier = Nothing Then
    14. img = My.Resources.SanKalk_Briefbogen_1
    15. Else
    16. img = Image.FromFile(My.Settings.Pgm_Eins_Druck_PfadPapier)
    17. End If
    18. Else
    19. img = My.Resources.SanKalk_Briefbogen_1
    20. End If
    21. e.Graphics.DrawImage(img, 0, 0, 116, 165)
    22. x = Math.Round(CDbl(txb_ranboben.Text) / 18, 0)
    23. e.Graphics.DrawLine(New Pen(System.Drawing.Color.Red, 1), 0, x, 115, x)
    24. y = Math.Round(CDbl(txb_randlinks.Text) / 18, 0)
    25. e.Graphics.DrawLine(New Pen(System.Drawing.Color.Red, 1), y, 0, y, 164)
    26. End Sub
    27. Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click
    28. PictureBox1.Invalidate()
    29. End Sub
    Stimmt, bis auf das:

    ponmalka schrieb:

    kannst du dazu den Sub "PictureBox1_Paint" (mit entsprechenden Parametern)

    Generell geht das, nur hat die Methode eine Signatur, die als zweiten Parameter "PaintEventArgs" erwartet, in denen auch das GraphicsObject drinnen ist. Und das kann man nicht einfach so herzaubern. Außerdem ist .Invalidate() viel einfacher ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    WEil du nicht zuhörst
    Jou.
    @michl75:: So geht das:

    VB.NET-Quellcode

    1. Private y As Integer = 100
    2. Private Sub PictureBox1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    3. Dim g = e.Graphics
    4. g.DrawLine(New Pen(System.Drawing.Color.Red, 1), y, 0, y, 164)
    5. End Sub
    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!
    Achja, weil das ja wahrschienlich ist dass das GraphicsObjekt noch vom Control selbst genutzt wird richtig ?
    Dann darf ich doch auch nicht Using g As Graphics = e.Graphics .... End Using nutzen oder ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Siehe zwei Posts später
    Ich bekomme das Graphics-Objekt und ich benutze es.
    Ansonsten lasse ich es in Ruhe. :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!