Trucos Mover un formulario sin barra de título   (2 artículos )

Declarar :

  Para 16 bits :
      Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
      Declare Sub ReleaseCapture Lib "User" ()

Para 32 bits :
      Declare Sub ReleaseCapture Lib "User32" Alias "ReleaseCapture" ()
      Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

Para ambas :

Global Const WM_SYSCOMMAND = &H112
Global Const SC_MOVE = &HF012


En el evento Form_MouseDown escribiremos el código :

Dim res As Long
ReleaseCapture
res = SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_MOVE, 0&)

El mensaje WM_NCLBUTTON es generado por Windows cuando el usuario hace click con el botón derecho del ratón sobre la barra de título de una ventana. Windows emplea este mensaje para saber cuándo la ventana debe moverse por las siguientes acciones del usuario.
Si la ventana no tiene barra de título este mensaje no se genera, pero es útil para mover una ventana que no tiene barra de título.
Una ventana o un formulario de Visual Basic 32 bits no tiene barra de título si :

Visual Basic 5.0
  Caption = ""
  ControlBox = False

Visual Basic 4.0
  Caption = ""
  ControlBox = False
  MaxButton = False
  MinButton = False


El código que viene a continuación muestra cómo mover un formulario sin barra de título pinchando y arrastrándolo desde cualquier parte del formulario.
El código situado en el evento MouseMove del formulario puede ponerse en otro evento si se quiere. Por ejemplo en el evento MouseDown de una etiqueta para permitir mover el formulario pinchando en la misma.


Declaramos en el formulario :

Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Y en el evento MouseMove del formulario :

Dim lngReturnValue As Long

If Button = 1 Then 'si es el botón izquierdo
   Call ReleaseCapture
   lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If


NOTA
Este mismo procedimiento nos sirve para mover cualquier control que tenga la propiedad hWnd, sustituyendo Me.hWnd por Control.hWnd en la función SendMenssage.
Si el control que deseamos mover no tiene esta propiedad siempre podremos crear un UserControl que posea esta propiedad y contenga el control que deseamos mover.



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com