Bild in PictureBox laden und dann darauf malen

  • VB.NET

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

    Bild in PictureBox laden und dann darauf malen

    Ich habe mir ein Programm gemacht, was ähnlich wie Paint funktioniert.

    Also man kann ein Bild laden und dann darauf rummalen.

    Leider ist da iwie etwas komisch. Wenn zB die Maus unten rechts ist, dann ist der Punkt nicht unten rechts, sondern weiter oben...



    Wenn ich die Kanten unten und rechts lang gehe, dann erkennt man das Fenster wo er nur malt:



    Und so sieht mein Code dazu aus:

    VB.NET-Quellcode

    1. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PictureBoxControls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    2. ' Pen-Control in Picturebox
    3. Private Sub pencil_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pencil.Click
    4. pn_klck = 1
    5. End Sub
    6. ''Klick in Picturebox
    7. Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
    8. If pn_klck_in = 0 And pn_klck = 1 Then
    9. pn_klck_in = 1
    10. ElseIf pn_klck_in = 1 Then
    11. pn_klck_in = 0
    12. Else
    13. End If
    14. End Sub
    15. '' Rubber-Control in Picturebox
    16. Private Sub rubber_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rubber.Click
    17. pn_klck = 0
    18. pn_klck_in = 0
    19. With PictureBox1
    20. .Visible = True
    21. .Load(dat_path)
    22. '.SizeMode = PictureBoxSizeMode.CenterImage
    23. .SizeMode = PictureBoxSizeMode.StretchImage
    24. .BorderStyle = BorderStyle.Fixed3D
    25. 'Bearbeitungsknöpfe
    26. .Controls.Add(pencil)
    27. .Controls.Add(rubber)
    28. .Controls.Add(SavePic)
    29. pencil.Visible = True
    30. rubber.Visible = True
    31. SavePic.Visible = True
    32. End With
    33. End Sub
    34. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Funktionen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    35. ' ZeichnenFkt.
    36. Private Sub picOut_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    37. If pn_klck = 1 Then
    38. If pn_klck_in = 1 Then
    39. ' Graphics-Objekt erstellen
    40. Using g = Graphics.FromImage(PictureBox1.Image), Brush = New SolidBrush(Color.FromArgb(200, Color.Red))
    41. g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    42. g.FillEllipse(Brush, e.Location.X, e.Location.Y, 20, 20)
    43. End Using
    44. ' Ergebnis anzeigen
    45. PictureBox1.Invalidate()
    46. End If
    47. End If
    48. End Sub


    Wo muss ich was ändern, damit er nun überall malt und nicht einen Teil auslässt?
    Genau.
    Achreib Dir die Mouse-Koordinaten im MouseMove-Event in 2 Label, dann wirst Du sehen.
    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!
    Also, habe es durch Zufall gelöst.

    Dachte mir so schauste dir mal die PixelZahlen an, weil das Bild von oben, war zB größer als die PictureBox in der Form.
    Dies lag daran, dass ich folgendes drin hatte:

    VB.NET-Quellcode

    1. PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage


    Nachdem ich das rausgenommen hatte, lief es wieder so wie es sollte, aber das Bild wurde halt nur in dem Bereich gezeigt.
    Also habe ich das nun so gemacht, dass ich die PictureBox so vergrößert habe, wie ich sie brauche und nun klappt alles prima!