PictureBox mit der Maus bewegen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Elephant.

    PictureBox mit der Maus bewegen

    Ich möchte, wenn man mit der linken Maustaste in ein PictureBox klicke, sie verschieben können bis man die linke Mousetaste wieder loslässt.

    Was ich gefunden habe ist:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox2.Click
    2. If e.Button = Windows.Forms.MouseButtons.Left Then
    3. PictureBox1.Location = New Point(MousePosition.X, MousePosition.Y)
    4. End If
    5. End Sub


    Aber e.Button ist wellig unterstrichen und es heißt "Button" ist kein Member von "Systems.EventArgs".

    Soll zwar später so sein, dass wenn die PictureBox in einem bestimmten Bereich ist, dass sie auf eine fixe Position gesetzt wird und sonst wieder an den Ursprungsort springt.
    Denke, das sollte ich aber selber hinbekommen.
    Es sind mehrere PictureBoxen, die man bewegen können soll.
    Da müsste ich bei MouseDown die Position der Maus abfragen um zu wissen welche PictureBox bewegt werden soll.
    Dann mit einer Dauerschleife die Postion der PictureBox an die Position der Mouse zu verschieben und bei MouseUp die Schleife beenden.
    Ich vermute das es auch einfachere Möglichkeiten gibt.

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

    Käse!

    VB.NET-Quellcode

    1. ​Public Class Form3
    2. Private clickedPicBox As PictureBox
    3. Private Sub PictureBox_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown, PictureBox2.MouseDown
    4. clickedPicBox = DirectCast(sender, PictureBox)
    5. WhoAmI()
    6. End Sub
    7. Private Sub PictureBox_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp, PictureBox2.MouseUp
    8. clickedPicBox = DirectCast(sender, PictureBox)
    9. WhoAmI()
    10. End Sub
    11. Private Sub WhoAmI()
    12. MessageBox.Show(clickedPicBox.Name)
    13. End Sub
    14. End Class
    @Elephant So was:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim x As Integer
    3. Dim y As Integer
    4. Private Sub Bild1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    5. x = Control.MousePosition.X - PictureBox1.Location.X
    6. y = Control.MousePosition.Y - PictureBox1.Location.Y
    7. PictureBox1.BringToFront()
    8. End Sub
    9. Private Sub Bild1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    10. If e.Button = MouseButtons.Left Then
    11. Dim newpoint = Control.MousePosition
    12. newpoint.X -= x
    13. newpoint.Y -= y
    14. PictureBox1.Location = newpoint
    15. End If
    16. End Sub
    17. End Class
    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!
    @Elephant Sieh Dir mal die Funktion Rectangle.Contains(...) an:
    docs.microsoft.com/de-de/dotne…gle.contains?view=net-6.0
    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!
    @RodFromGermany Ich hab es jetzt für 2 PictureBoxen bewegen und 9 Fixe Position wo die PictureBoxen einrasten.
    Es sollen aber noch mehr wie 2 PictureBoxen werden.
    Gibt es eine Möglichkeit das Bewegen der Pic Boxen so zu schreiben, dass ich nicht für jede Box die zwei Sub brauche.
    Hier mein Stand

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim x As Integer
    3. Dim y As Integer
    4. Private clickedPicBox As PictureBox
    5. Private pb() As PictureBox
    6. Dim PicBoxName As String
    7. Dim PicBoxNr As Integer
    8. Dim PicBoxListe As String() = {"PictureBox1", "PictureBox2"}
    9. Dim ListeFixPos(8, 1) As Integer
    10. Dim X_Alt As Integer
    11. Dim Y_Alt As Integer
    12. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    13. pb = New PictureBox() {PictureBox1, PictureBox2, PictureBox3, PictureBox4}
    14. Dim Zaehler As Integer
    15. For i = 0 To 2
    16. For j = 0 To 2
    17. ListeFixPos(Zaehler, 0) = 700 + j * 72
    18. ListeFixPos(Zaehler, 1) = 50 + i * 72
    19. Zaehler += 1
    20. Next
    21. Next
    22. End Sub
    23. Private Sub Bild1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    24. x = Control.MousePosition.X - PictureBox1.Location.X
    25. y = Control.MousePosition.Y - PictureBox1.Location.Y
    26. X_Alt = PictureBox1.Location.X
    27. Y_Alt = PictureBox1.Location.Y
    28. PictureBox1.BringToFront()
    29. End Sub
    30. Private Sub Bild1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    31. If e.Button = MouseButtons.Left Then
    32. Dim newpoint = Control.MousePosition
    33. newpoint.X -= x
    34. newpoint.Y -= y
    35. PictureBox1.Location = newpoint
    36. End If
    37. End Sub
    38. Private Sub Bild2_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseDown
    39. x = Control.MousePosition.X - PictureBox2.Location.X
    40. y = Control.MousePosition.Y - PictureBox2.Location.Y
    41. X_Alt = PictureBox2.Location.X
    42. Y_Alt = PictureBox2.Location.Y
    43. PictureBox2.BringToFront()
    44. End Sub
    45. Private Sub Bild2_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseMove
    46. If e.Button = MouseButtons.Left Then
    47. Dim newpoint = Control.MousePosition
    48. newpoint.X -= x
    49. newpoint.Y -= y
    50. PictureBox2.Location = newpoint
    51. End If
    52. End Sub
    53. Private Sub PictureBox_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp, PictureBox2.MouseUp
    54. clickedPicBox = DirectCast(sender, PictureBox)
    55. WhoAmI()
    56. End Sub
    57. 'Private Sub PictureBox_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown, PictureBox2.MouseDown
    58. ' clickedPicBox = DirectCast(sender, PictureBox)
    59. ' WhoAmI()
    60. 'End Sub
    61. Private Sub WhoAmI()
    62. PicBoxName = clickedPicBox.Name
    63. For i = 0 To 1
    64. If PicBoxListe(i) = PicBoxName Then
    65. PicBoxNr = i
    66. End If
    67. Next
    68. PositionPruefen()
    69. End Sub
    70. Private Sub PositionPruefen()
    71. Dim X As Integer
    72. Dim Y As Integer
    73. X = pb(PicBoxNr).Left
    74. Y = pb(PicBoxNr).Top
    75. For i = 0 To 8
    76. If X >= ListeFixPos(i, 0) - 30 And X <= ListeFixPos(i, 0) + 30 Then
    77. If Y >= ListeFixPos(i, 1) - 30 And Y <= ListeFixPos(i, 1) + 30 Then
    78. pb(PicBoxNr).Location = New Point(ListeFixPos(i, 0), ListeFixPos(i, 1))
    79. Exit Sub
    80. End If
    81. End If
    82. Next
    83. pb(PicBoxNr).Location = New Point(X_Alt, Y_Alt)
    84. End Sub
    85. End Class
    @Elephant Klar.
    Da immer nur eine PictureBox auf einmal bewegt werden kann, kannst Du die EventHandler multipel einsetzen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim x As Integer
    3. Dim y As Integer
    4. Private Sub Bild1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown, PictureBox2.MouseDown, PictureBox3.MouseDown, PictureBox4.MouseDown
    5. Dim pb As PictureBox = DirectCast(sender, PictureBox)
    6. x = Control.MousePosition.X - pb.Location.X
    7. y = Control.MousePosition.Y - pb.Location.Y
    8. pb.BringToFront()
    9. End Sub
    10. Private Sub Bild1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove, PictureBox2.MouseMove, PictureBox3.MouseMove, PictureBox4.MouseMove
    11. If e.Button = MouseButtons.Left Then
    12. Dim pb As PictureBox = DirectCast(sender, PictureBox)
    13. Dim newpoint = Control.MousePosition
    14. newpoint.X -= x
    15. newpoint.Y -= y
    16. pb.Location = newpoint
    17. End If
    18. End Sub
    19. End Class
    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!