Geralmente quando definimos um layout diferenciado para uma aplicação Windows, nós necessitamos tratar os formulários e para combinar cores podemos definir o formulário sem bordas e criar uma borda mais trabalhada para a aplicação, arredondada ou simplesmente com uma cor diferenciada.
O problema é que quando definimos um formulário sem a title bar e necessitamos do movimento do formulário.
Para corrigir isso basta utilizar o evento mouse move, abaixo vou descrever as partes do código.
Private pPermiteMover As Boolean = False
Private pMouseX As Integer = 0
Private pMouseY As Integer = 0
Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Me.MouseDown
If e.Button = MouseButtons.Left Then pPermiteMover = True : pMouseX = e.X : pMouseY = e.Y
End Sub
A variável pPermiteMover terá o valor igual a verdadeiro quando acontecer o evento MouseDown através do botão esquerdo do mouse e nesse caso também irá atribuir o valor da posição X do cursor para a variável pMouseX e Y para a variável pMouseY.
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If pPermiteMover = True Then
Dim lPosicaoAtual As Point = New Point()
lPosicaoAtual.X = Me.Location.X + (e.X – pMouseX)
lPosicaoAtual.Y = Me.Location.Y + (e.Y – pMouseY)
Me.Location = lPosicaoAtual
lPosicaoAtual = Nothing
End If
End Sub
O evento mouse move, verifica se é permitido mover e atribui a variável lPosicaoAtual os pontos somados através da localização atual e a subtração da posição do eixo X e Y com o pMouseX e Y.
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If e.Button = MouseButtons.Left Then
pPermiteMover = False
End If
End Sub
Já no evento MouseUp, que verifica se o botão é o esquerdo e se for atribuí o valor falso para o variável que permite mover o formulário.
Esse código permite mover o formulário inteiro, porém se foi criado uma title bar personalizada será necessária colocar esse código no componente utilizado para formar a nova title bar.
Para fazer o teste basta copiar e colar o código abaixo.
Public Class Form1
#Region “Move Formulário”
Private pPermiteMover As Boolean = False
Private pMouseX As Integer = 0
Private pMouseY As Integer = 0
Private Sub Form1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles Me.MouseDown
If e.Button = MouseButtons.Left Then pPermiteMover = True : pMouseX = e.X : pMouseY = e.Y
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If pPermiteMover Then
Dim lPosicaoAtual As Point = New Point()
lPosicaoAtual.X = Me.Location.X + (e.X – pMouseX)
lPosicaoAtual.Y = Me.Location.Y + (e.Y – pMouseY)
Me.Location = lPosicaoAtual
lPosicaoAtual = Nothing
End If
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If e.Button = MouseButtons.Left Then
pPermiteMover = False
End If
End Sub
#End Region
End Class
Abraço, Rodrigo