Form ohne Rahmen ohne aufwendige APIs verschieben

  • VB.NET

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

    Form ohne Rahmen ohne aufwendige APIs verschieben

    Hi @ all,

    ich habe eine frage: wie verschiebe ich eine form, welche keine rahmen hat(Borderstyle = none)

    ich habe bereits folgenden code, der funktioniert:

    VB.NET-Quellcode

    1. Private Sub form_move()
    2. Do
    3. If mouse_down = True Then
    4. point_mouse = Cursor.Position
    5. Me.Location = point_mouse
    6. End If
    7. Loop
    8. End Sub


    das ganze läuft über die events mousedown und mouse up

    aber egal wo ich auf der form hinklicke klebt die form dann mit der linken oberen ecke an der maus... wie bekomme ich es hin, dass sich die form verschieben lässt, auch wenn ich den mauszeiger meinetwegen unten rechts ansetzte. im aktuellen fall hängt die form dann wieder mit der oberen linken ecke an der maus...

    schon mal ty for helping me

    KnifeHunter
    aka. EsTari
    @ SystemUnknow -> keine aufwändigen APIs bitte danke einfach C&P nein danke, da ich es nicht verstehe - außerdem will ich eine eigene funktion, die ich nach belieben anpassen kann. das kann ich bei der API nicht, da ich erstmal kapieren müsste, wie das alles funzt. X(

    @ Samus Aran -> Glaubst du wirklich, dass ich das nicht schon längst gemacht habe? - ich habe an den 2 positionen rumaddiert und subtrahiert und bin trotz dem nicht weiter... wenn ich da so einfach selbst draufkommen würde, dann würde ich sicher nicht hier rumposten X(

    eure beiträge helfen mir nicht im geringsten - tut mir leid.

    VB.NET-Quellcode

    1. Dim StartPosition As Point
    2. Dim DragPosition As Point
    3. Public 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. StartPosition = Me.Location
    6. DragPosition = Me.PointToScreen(New Point(e.X, e.Y))
    7. End If
    8. End Sub
    9. Public Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    10. If e.Button = Windows.Forms.MouseButtons.Left Then
    11. Dim CursorPosition As Point = Me.PointToScreen(New Point(e.X, e.Y))
    12. Me.Location = New Point(StartPosition.X + CursorPosition.X - DragPosition .X, _
    13. StartPosition.Y +CursorPosition.Y - DragPosition .Y)
    14. End If
    15. End Sub


    Gruß Vitox
    Arbeitet hier eigentlich jemand richtig mit Visual Studio?
    Eigentlich sollte man davon ausgehen, dass man sein Werkzeug kennt.

    VS hat ein Feature an Board, welches für genau solche Kleinigkeiten (die 2x im Monat hier gefragt werden) Lösungen bereit hält.
    Code-Snippets. Rechte Maustaste im Code-Fenster, "Ausschnitt einfügen".
    Bilder
    • Ziehen.jpg

      76,01 kB, 1.028×285, 2.510 mal angesehen
    Ich benutze zum verschieben für gewöhnlich folgenden Code. Ist zwar mittels API, aber aufwändig is anders.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. #Region "API-Funition zum Verschieben der Form"
    3. Public Declare Function ReleaseCapture Lib "user32" () As Integer
    4. Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Object) As Integer
    5. Public Const WM_NCLBUTTONDOWN = &HA1
    6. Public Const HTCAPTION = 2
    7. #End Region
    8. #Region "Form verschieben"
    9. Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseDown
    10. 'Form verschieben ermöglichen
    11. ReleaseCapture()
    12. SendMessage(CInt(Handle), WM_NCLBUTTONDOWN, HTCAPTION, 0)
    13. End Sub
    14. #End Region
    15. End Class

    Die Form kann verschoben werden, indem der folgende Code in das Mouse_Down Event des zum Verschieben bevorzugte Controls geschrieben wird. (Zumindest dürfte er dort am Sinnvollsten aufgehoben sein)
    Sollen mehrere Controls das verschieben ermöglichen, kannst du diese bei Handles mit eintragen.

    VB.NET-Quellcode

    1. ReleaseCapture()
    2. SendMessage(CInt(Handle), WM_NCLBUTTONDOWN, HTCAPTION, 0)


    //Edit Als Public Deklariert, weil ich die API Deklaration oft in einem Modul vornehme und sie dann für alle zum Projekt gehörigen Fenster benutzbar ist.
    Mhmm Danke bin erst kurz in VB.

    War aber nicht die Form sondern Panel1 wie geht das jetzt ?
    Habe bei den Code auschnitten nichts gefunden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Björn“ ()

    Du weißt aber das der Thread schon 1 Jahr alt ist?
    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!