Fenster Verschieben mit Panel

  • VB.NET

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

    Fenster Verschieben mit Panel

    Ich habe ein kleines Problem.

    Ich habe eine Windows Forms erstellt und möchte diese über ein Panel verschieben.
    Nur habe ich da nun ein Problem, sobald ich die Form verschiebe Springt sie hin und her sollang ich die maus gedrückt halte.

    Hier der Code zum Bewegen des Fensters

    VB.NET-Quellcode

    1. Private Sub Panel2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseDown
    2. FormMove = True
    3. End Sub
    4. Private Sub Panel2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseMove
    5. If FormMove Then
    6. Me.Location = e.Location
    7. End If
    8. End Sub
    9. Private Sub Panel2_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseUp
    10. FormMove = False
    11. End Sub


    Ich hoffe ihr könnt mir da auf die Sprünge Helfen ;)
    Me.Location ist die linke obere Ecke; e.Location ist die aktuelle Position des Cursors
    Da du die beide gleich setzt, springt die obere linke Ecke der Form logischerweise auch dahin.
    Um diesen Effekt zu verhindern, musst Du die Cursorposition bzw. die vertikale und horizontale Abstände von dieser Position zu der linken oberen Ecke der Form merken und sie beim MouseMove von der aktuellen Cursorposition abziehen.
    Willkommen im Forum. :thumbup:
    Du musst noch die Position des Panels in der Form berücksichtigen:

    VB.NET-Quellcode

    1. Private Sub Panel2_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel2.MouseMove
    2. If e.Button = MouseButtons.Left Then
    3. Dim mousePos As Point = Control.MousePosition
    4. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    5. Dim mouseOffset2 = Panel1.Location
    6. mousePos.Offset(-mouseOffset2.X, -mouseOffset2.Y)
    7. Me.Location = mousePos
    8. End If
    9. 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!
    Hmm Ich habe deinen Code mal Kopiert und ersetzt mit den stück bei mir jedoch habe ich da ein fehler:

    Quellcode

    1. "mouseOffset" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden


    Wie muss ich das Deklarieren?
    Schreib in die Klasse:

    VB.NET-Quellcode

    1. Private mouseOffset As Point
    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!
    Das funktioniert bestens bei FormBorderStyle = None
    Der Sprung sieht aus, als wäre es die Höhe der Titelzeile des Fensters.

    VB.NET-Quellcode

    1. Private MyHeight As Integer = 0
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. MyHeight = Me.Size.Height - Me.ClientSize.Height
    4. End Sub
    5. Private Sub Panel1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel1.MouseMove
    6. If e.Button = MouseButtons.Left Then
    7. Dim mousePos As Point = Control.MousePosition
    8. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    9. Dim mouseOffset2 = Panel1.Location
    10. mousePos.Offset(-mouseOffset2.X - MyHeight, -mouseOffset2.Y)
    11. Me.Location = mousePos
    12. End If
    13. 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!
    Kannst Du bitte mal Deinen ganzen Code posten?
    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!
    Ja, ist ein wenig sehr viel Code zum Nachvollziehen.
    Kannst Du den ausschließlich relevanten Teil posten?
    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!

    VB.NET-Quellcode

    1. Private mouseOffset As Point
    2. Private MyHeight As Integer = 0
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. MyHeight = Me.Size.Height - Me.ClientSize.Height
    5. End Sub
    6. Private Sub Panel2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseDown
    7. FormMove = True
    8. End Sub
    9. Private Sub Panel2_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel2.MouseMove
    10. If e.Button = MouseButtons.Left Then
    11. Dim mousePos As Point = Control.MousePosition
    12. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    13. Dim mouseOffset2 = Panel1.Location
    14. mousePos.Offset(-mouseOffset2.X - MyHeight, -mouseOffset2.Y)
    15. Me.Location = mousePos
    16. End If
    17. End Sub
    18. Private Sub Panel2_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseUp
    19. FormMove = False
    20. End Sub
    Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private mouseOffset As Point
    3. Private MyHeight As Integer = 0
    4. Private MyBorder As Integer = 0
    5. Private FormMove = False
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. MyHeight = Me.Size.Height - Me.ClientSize.Height
    8. MyBorder = (Me.Size.Width - Me.ClientSize.Width) \ 2
    9. End Sub
    10. Private Sub Panel2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseDown
    11. FormMove = True
    12. mouseOffset = New Point(-e.X, -e.Y)
    13. End Sub
    14. Private Sub Panel2_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel2.MouseMove
    15. If e.Button = MouseButtons.Left Then
    16. Dim mousePos As Point = Control.MousePosition
    17. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    18. Dim mouseOffset2 = Panel2.Location
    19. mousePos.Offset(-mouseOffset2.X - MyBorder, -mouseOffset2.Y - MyHeight)
    20. Me.Location = mousePos
    21. End If
    22. End Sub
    23. Private Sub Panel2_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseUp
    24. FormMove = False
    25. End Sub
    26. 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!
    Es geht auch ganz einfach:

    VB.NET-Quellcode

    1. Dim x, y As Integer
    2. Dim newpoint As Point
    3. Private Sub pnlHeader_MouseDown(sender As Object, e As MouseEventArgs) Handles pnlHeader.MouseDown
    4. x = MousePosition.X - Me.Location.X
    5. y = MousePosition.Y - Me.Location.Y
    6. End Sub
    7. Private Sub pnlHeader_MouseMove(sender As Object, e As MouseEventArgs) Handles pnlHeader.MouseMove
    8. If e.Button = MouseButtons.Left Then
    9. newpoint = MousePosition
    10. newpoint.X -= x
    11. newpoint.Y -= y
    12. Me.Location = newpoint
    13. End If
    14. End Sub


    *Topic älter als 6 Jahre* Bitte keine alten Threads ausgraben - Thema geschlossen ~NoFear23m
    Grüße, Matix

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