Form verschieben - auch einfacher?

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von radio-ffk.

    Form verschieben - auch einfacher?

    Hallo alle zusammen.
    Ich entwickle zur Zeit einen Schildergenerator. Dieser hat in jeder Form BorderStyle = None, weil's einfach besser aussieht.
    Nur wäre es trotzdem praktisch, die Form verschieben zu können. Bisher löse ich das so:

    VB.NET-Quellcode

    1. Private Sub MetroStatusStrip2_MouseMove(sender As Object, e As MouseEventArgs) Handles MetroStatusStrip2.MouseMove
    2. If e.Button = MouseButtons.Left Then
    3. Dim mousePos = Control.MousePosition
    4. mousePos.Offset(mouseOffset.X, mouseOffset.Y)
    5. Location = mousePos
    6. End If
    7. End Sub

    Allerdings ist hier das Problem, dass die Maus schnell aus dem StatusStrip raus ist, und die Form nur noch hängt. :(
    Kann man das irgendwie einfacher lösen, ohne dass dieses Problem auftritt?
    Hab schon CodeSnippets verwendet, die lösen mein Problem aber nicht.
    Bin für jede Hilfe dankbar.

    Anlagen:


    Die obere grüne Leiste ist der betroffene MetroStatusStrip

    radio-ffk schrieb:

    VB.NET-Quellcode

    1. Handles MetroStatusStrip2.MouseMove
    Wenn Du die Form verschieben willst, probier mal das:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private CursorPosition As Point
    3. Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    4. If e.Button = Windows.Forms.MouseButtons.Left Then
    5. CursorPosition = e.Location
    6. End If
    7. End Sub
    8. Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    9. If e.Button = Windows.Forms.MouseButtons.Left Then
    10. Me.Location += CType(e.Location, Size) - CType(CursorPosition, Size)
    11. End If
    12. End Sub
    13. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    14. Me.Close()
    15. End Sub
    16. 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!
    Ich glaube dass meine Problem nicht ganz richtig verstanden wird. Meine Form bewegt sich, nur zu langsam. Das heißt dass die Form der Maus nicht hinterherkommt und die Maus dementsprechend immer aus der Form raus geht. Daher ruckelt die Form nur und man muss immer wieder zurück zur Form und neu klicken und ziehen. Wie kann ich also diese Zeitverzögerung so einfach wie möglich verhindern?
    Füg das mal bei deinem Code ein, direkt nach Public Class DeinFormName (wie deine Form halt heißt)

    VB.NET-Quellcode

    1. Private Declare Function ReleaseCapture Lib "user32" () As Integer
    2. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    3. ByVal hwnd As Integer, _
    4. ByVal wMsg As Integer, _
    5. ByVal wParam As Integer, _
    6. ByRef lParam As Object) As Integer
    7. Private Const HTCAPTION As Short = 2
    8. Private Const WM_NCLBUTTONDOWN As Short = &HA1S
    9. Private Const WM_SYSCOMMAND As Short = &H112S
    10. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    11. ByVal hwnd As IntPtr, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal _
    12. lParam As IntPtr) As Int32

    und geh dann in dein MouseDown Event von MetroStatusStrip2 und füg das hier ein:

    VB.NET-Quellcode

    1. ReleaseCapture()
    2. SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0)
    Hier auch noch eine variante mit der WinAPI, diese nehme ich vorwiegened bei NoneBorder-Form, damit kann mann auch die größe der Form beeinflussen, wenn manns gschickt macht dann auch wie man es von mit Border kennt. Desweiteren hat man eine sehr gute Performence mit dieser Function, beim verschieben und beim "Resizen".

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32.dll")> _
    4. Public Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
    5. End Function
    6. Private Sub Panel1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
    7. Static PosBuffer As New Point(Cursor.Position.X - Me.Left, Cursor.Position.Y - Me.Top)
    8. If e.Button = MouseButtons.Left Then
    9. Dim x As Integer = Cursor.Position.X - PosBuffer.X
    10. Dim y As Integer = Cursor.Position.Y - PosBuffer.Y
    11. MoveWindow(Me.Handle, x, y, Me.Width, Me.Height, True)
    12. Else
    13. PosBuffer = New Point(Cursor.Position.X - Me.Left, Cursor.Position.Y - Me.Top)
    14. End If
    15. End Sub
    16. End Class


    @TheKing4241: hier ein kleine Lektüre über API deklarationen, gugge dort mal nach der Deklaration von SendMessage und ReleaseCapture für VB.Net ;)

    pinvoke.net/

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

    radio-ffk schrieb:

    Ich glaube dass meine Problem nicht ganz richtig verstanden wird.
    Hast Du mein Beispiel aus Post #3 mal in einer neuen Form ausprobiert?
    Kann es sein, dass Dein Code einfach nur falsch ist?
    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!
    Für alle die es Interessiert: [Beta] Schildergenerator2

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „radio-ffk“ ()