3 votes

Permettre à un utilisateur de déplacer une fenêtre sans bordure

J'ai un formulaire sans bordures que je voudrais que l'utilisateur puisse déplacer. Je n'ai pas réussi à trouver quelque chose qui me permette de le faire.

Est-il possible de déplacer une fenêtre dont la bordure est réglée sur Aucun ?

12voto

Introduisez une variable booléenne qui indique si le formulaire est en cours de déplacement et des variables qui indiquent le point de départ du déplacement. Ensuite, OnMove déplace le formulaire en conséquence. Comme cette question a déjà été traitée ailleurs, je me contente de la copier-coller ici.

Class Form1
    Private IsFormBeingDragged As Boolean = False
    Private MouseDownX As Integer
    Private MouseDownY As Integer

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown

        If e.Button = MouseButtons.Left Then
            IsFormBeingDragged = True
            MouseDownX = e.X
            MouseDownY = e.Y
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseUp

        If e.Button = MouseButtons.Left Then
            IsFormBeingDragged = False
        End If
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove

        If IsFormBeingDragged Then
            Dim temp As Point = New Point()

            temp.X = Me.Location.X + (e.X - MouseDownX)
            temp.Y = Me.Location.Y + (e.Y - MouseDownY)
            Me.Location = temp
            temp = Nothing
        End If
    End Sub
End Class

volé à http://www.dreamincode.net/forums/topic/59643-moving-form-with-formborderstyle-none/

6voto

Stephan VDH Points 51

Toutes les réponses "simples" en VB ont fait sauter mon formulaire dans tous les sens avec des écrans multiples. J'ai donc dérivé ceci de la même réponse en C# et cela fonctionne comme un charme :

Public Const WM_NCLBUTTONDOWN As Integer = 161
Public Const HT_CAPTION As Integer = 2

entonces

 <DllImport("User32")> Private Shared Function SendMessage(hWnd As IntPtr, Msg As Integer, wParam As Integer, lParam As Integer) As Integer

End Function

<DllImport("User32")> Private Shared Function ReleaseCapture() As Boolean

End Function

et enfin

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    If (e.Button = MouseButtons.Left) Then
        ReleaseCapture()
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0)
    End If
End Sub

1voto

user959631 Points 912
Dim offSetX As Integer
Dim offSetY As Integer

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Me.Location = New Point(Cursor.Position.X - offSetX, Cursor.Position.Y - offSetY)
End Sub

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    offSetX = PointToClient(Cursor.Position).X
    offSetY = PointToClient(Cursor.Position).Y
    Timer1.Enabled = True
End Sub

Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    Timer1.Enabled = False
End Sub

C'est une façon un peu débraillée de le faire xD

J'espère que cela vous aidera =]

1voto

Ken Keenan Points 5173

Une autre façon de procéder consiste à traiter le WM_NCHITTEST message . Cela vous permet de faire en sorte que certaines parties de votre formulaire répondent aux événements de la souris comme le feraient la barre de titre, les bordures, etc. dans une fenêtre avec des bordures. Par exemple, si vous avez une étiquette sur votre formulaire et que vous renvoyez la commande HTCAPTION dans le WM_NCHITTEST vous pourrez déplacer le formulaire en faisant glisser cette étiquette, tout comme vous pouvez déplacer une fenêtre ordinaire en la faisant glisser sur sa barre de titre. Voir ce qui suit Question sur Stack Overflow par exemple le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X