타이틀바가 없는 폼을 마우스로 이동시키는 방법입니다.

여기에서는 Win32 API를 사용하지 않는 방법을 소개합니다.

 

[ 마우스 이벤트를 이용하는 방법 ]

우선은, 가장 기본적인 방식입니다.

다음의 코드에서는, 단순하게 폼(Form1) 상에서 마우스의 왼쪽 버튼이 눌려져서 이동시킨 것을 감지하는 것으로써 처리하고 있습니다.

 

'마우스의 클릭위치를 기억한다.
Private mousePoint As Point

'마우스의 버튼이 눌러졌을때

Private Sub Form1_MouseDown(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.MouseEventArgs) _
  Handles MyBase.MouseDown
    If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        '위치를 기억한다.
        mousePoint = New Point(e.X, e.Y)
    End If
End Sub

 

'마우스가 이동했을때

Private Sub Form1_MouseMove(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.MouseEventArgs) _
  Handles MyBase.MouseMove
    If (e.Button And MouseButtons.Left) = MouseButtons.Left Then
        Me.Left += e.X - mousePoint.X
        Me.Top += e.Y - mousePoint.Y
        '혹은, 아래와같이 처리한다.
        'Me.Location = New Point( _
        '    Me.Location.X + e.X - mousePoint.X, _
        '    Me.Location.Y + e.Y - mousePoint.Y)
    End If
End Sub

 

위의 예에서는 폼에 있는 컨트롤에서 마우스의 버튼을 눌러 드래그 해도, 윈도우는 이동하지 않습니다. 컨트롤상의 드래그로도 이동할 수 있도록 하려면, 그 컨트롤의 MouseDown 및 MouseMove 이벤트 핸들러에 Form1_MouseDown 및 Form1_MouseMove를 추가하면 됩니다.

예를 들면 Form1에 PictureBox1 오브젝트가 있어, PictureBox1상에서 mouse button을 눌러 드래그를해도 Form1을 이동할 수 있도록 하려면 다음과 같이 하면 됩니다.

 

Private mousePoint As PointPrivate Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseDown, PictureBox1.MouseDown   

End Sub


Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseMove, PictureBox1.MouseMove  

End Sub

+ Recent posts