PictureBox verschieben

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Michi M.

    PictureBox verschieben

    Hallo Commi. :)
    Ich habe eine PictureBox die ich mit der Maus
    verschieben kann, bloß nun will ich das ich noch eine
    PictureBox hinzufügen kann per Button das ich die DAnn auch verschieben
    kann und das sich die PicutreBoxen sich automatisch sich
    unter einander auflisten, so das man den überblick behält!
    Den code habe ich jetzt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim nStartPos As Point
    3. Dim nDragPos As Point
    4. Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As _
    5. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    6. If e.Button = Windows.Forms.MouseButtons.Left Then
    7. nStartPos = PictureBox1.Location
    8. nDragPos = PictureBox1.PointToScreen(New Point(e.X, e.Y))
    9. End If
    10. End Sub
    11. Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As _
    12. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. Dim nCurPos As Point = PictureBox1.PointToScreen(New Point(e.X, e.Y))
    15. PictureBox1.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, _
    16. nStartPos.Y + nCurPos.Y - nDragPos.Y)
    17. End If
    18. End Sub
    19. End Class

    Danke für eure Hilfe ;)
    Zum Auflisten:

    1. Eine List(Of PictureBox) erstellen, z.B.: Dim PBList As New List(Of PictureBox)
    2. Diese Liste mit PictureBoxen füllen, z.B.: PBList.Items.Add(New PictureBox)

    Für die Routine zum Verschieben kannst du mal am besten nach dem Stichwort "AddressOff" suchen, soweit ich mich erinnern kann, kannst du mit diesem Begriff irgendwie einer Aktion eine Routine zuweisen - Musste dich vllt mittels Google drüber schlau machen.

    MfG,
    X-Zat / Momo
    Ich vermute mal du erstellst die zweite PB so?
    Dim PB2 As New PictureBox
    Form.Controls.Add(PB2)

    Die Ereignisse kannst du soweit ich weiß mit AddHandler hinzufügen:

    VB.NET-Quellcode

    1. AddHandler PB2.MouseDown, AddressOf PictureBox1_MouseDown
    2. AddHandler PB2.MouseMove, AddressOf PictureBox1_MouseMove



    Außerdem musst du dann in den Ereignissen (PictureBox1.MouseMove, PictureBox1.MouseDown) immer das PictureBox1 durch Sender ersetzen.

    Also z.B. statt PictureBox1.Location = ... schreibst du Sender.Location = ...


    Edit:

    So hier hab ichs nochmal komplett:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim nStartPos As Point
    3. Dim nDragPos As Point
    4. Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As _
    5. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    6. If e.Button = Windows.Forms.MouseButtons.Left Then
    7. nStartPos = sender.Location
    8. nDragPos = sender.PointToScreen(New Point(e.X, e.Y))
    9. End If
    10. End Sub
    11. Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As _
    12. System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. Dim nCurPos As Point = sender.PointToScreen(New Point(e.X, e.Y))
    15. sender.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, _
    16. nStartPos.Y + nCurPos.Y - nDragPos.Y)
    17. End If
    18. End Sub
    19. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    20. Dim PB2 As New PictureBox
    21. With PB2
    22. .BackColor = Color.Beige
    23. .Size = New Point(100, 100)
    24. End With
    25. Me.Controls.Add(PB2)
    26. AddHandler PB2.MouseDown, AddressOf PictureBox1_MouseDown
    27. AddHandler PB2.MouseMove, AddressOf PictureBox1_MouseMove
    28. End Sub
    29. End Class

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

    aber wenn man das Add-Handler in dem Sub macht, dann streciht er bei den anderen Subs, des PictureBox an, wie mach ich das dann?
    (ich hab nämlich auch so ein Problem)

    gruß Einsteiger

    Edit: ich habs gelöst: einfach ne PicturebOx1 der Form hinzufügen, damit es des Event gibt
    siehe Edit

    noch ne Frage:

    wie kann ich der erstellten PictureBox das Event wieder "wegnehmen", das es nach einmal verschieben, also nicht mehr möglich ist es zu verschieben
    also wie kann ich das AddHandler rückgängig machen?

    Gruß Einsteiger
    OK ich habs jetzt noch mal anders gelöst:

    Ich habe einfach eine neue Class mit den Eigenschaften einer Pb erstellt und dann noch die eigenschaft beweglich als boolean deklariert. damit sparst du dir auch das addhandler ;)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    3. Dim PB As New Move_PictureBox
    4. With PB
    5. .BackColor = Color.Black
    6. .Size = New Point(100, 100)
    7. End With
    8. Me.Controls.Add(PB)
    9. End Sub
    10. End Class
    11. Public Class Move_PictureBox : Inherits PictureBox
    12. Dim Beweglich As Boolean = True
    13. Dim nStartPos As Point
    14. Dim nDragPos As Point
    15. Shadows Sub PictureBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    16. If Beweglich Then
    17. If e.Button = Windows.Forms.MouseButtons.Left Then
    18. nStartPos = Me.Location
    19. nDragPos = Me.PointToScreen(New Point(e.X, e.Y))
    20. End If
    21. End If
    22. End Sub
    23. Shadows Sub PictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    24. If Beweglich Then
    25. If e.Button = Windows.Forms.MouseButtons.Left Then
    26. Dim nCurPos As Point = Me.PointToScreen(New Point(e.X, e.Y))
    27. Me.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, _
    28. nStartPos.Y + nCurPos.Y - nDragPos.Y)
    29. End If
    30. End If
    31. End Sub
    32. End Class
    hey cool, und wenn ich beweglich auf Flase setzte gehts dann nimmer oder wie?

    Edit: ich habs jetzt ausprobiert, und habe dann die Bewglich-Variable Public deklariert, wenn ich jetzt aus einer anderen Klasse mit Move_PictureBox.Beweglich = False das ansprechen will kommt:

    Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.

    wie änder ich das? is sicher einfach, bloß blick ichs grad net.

    gruß Einsteiger

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

    genau so hab ichs doch, aber da verlangt er den Objektverweis

    und noch ne Frage: wie kann ich ne PicturebOx transparent machen?
    wenn ich bei BackColor transparent hinschreicbe ist die nicht transparent?
    ich blicks iwie net

    Gruß Einsteiger
    ne des mit Transparent hab ich gelöst.

    aber des mit dem auf die Variable zugreifen klappt bei mir net, und ich weiß net warum:

    ich habe deine neue Move_PicturBox - Klasse einfach direkt unter meiner Form1 - Klasse getan:

    VB.NET-Quellcode

    1. .
    2. .
    3. .
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Move_PictureBox.beweglich = False
    6. End Sub
    7. End Class
    8. Public Class Move_PictureBox : Inherits PictureBox
    9. Public beweglich As Boolean = True
    10. Dim nStartPos As Point
    11. Dim nDragPos As Point
    12. .
    13. .
    14. .


    und da streicht er mir Move_PictureBox.beweglich = False
    mit dem Fehler von vorher an.

    Woran kann das liegen?

    Gruß Einsteiger
    du erstellt doch eine Pb mit z.B. DIm pb1 As New Move_PictúreBox und dann musst du nicht die eigenschaft der klasse sondern die eigenschaft der pb ändern

    also nicht:
    Move_PictureBox.beweglich = false

    sondern:
    pb1.beweglich = false


    wenn du es allerdings allgemein für alle PictureBoxen haben willst würd ich einfach in der Klasse deiner Form dei Beweglich w´Variable deklarieren.

    also:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public beweglich As Booelan
    3. Sub Form_Load()
    4. ...
    5. End Sub
    6. End Class
    7. Public Class Move_PictureBox
    8. Sub MouseMove()
    9. if form1.beweglich then
    10. ...
    11. end if
    12. ENd Sub
    13. Sub Mouse_Down()
    14. if form1.beweglich Then
    15. ...
    16. End if
    17. ENd SUb
    18. ENd Class

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

    hi,
    ich hab mich für diesen code entschiden,
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1 Dim nStartPos As Point Dim nDragPos As PointPrivate Sub Form1_MouseDown (...) Handles Me.MouseDown
    2. If e.Button = Windows.Forms.MouseButtons.Left Then
    3. nStartPos = sender.Location
    4. nDragPos = sender.PointToScreen(New Point(e.X, e.Y))
    5. End If
    6. End Sub
    7. Private Sub Form1_MouseMove (...) Handles Me.MouseMove
    8. If e.Button = Windows.Forms.MouseButtons.Left Then
    9. Dim nCurPos As Point = sender.PointToScreen(New Point(e.X, e.Y))
    10. sender.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, _ nStartPos.Y + nCurPos.Y - nDragPos.Y)
    11. End If
    12. End Sub
    13. Private Sub Form1_Click (...) Handles Me.Click
    14. Dim PB2 As New PictureBox
    15. With PB2
    16. .BackColor = Color.Beige
    17. .Size = New Point(100, 100)
    18. End With
    19. Me.Controls.Add(PB2)
    20. AddHandler PB2.MouseDown, AddressOf Form1_MouseDown
    21. AddHandler PB2.MouseMove, AddressOf Form1_MouseMove End SubEnd Class


    um eine Form zu verschiben.
    Aber bei jedem klick kommt eine PB. wass kann ich dagegen tun?

    MfG

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