Mover un Form usando el
API de Windows
y mover una imagen por el form
(eso de propina)
Colaboración de:
José M. Alarcón Aguín jalarcon@uvigo.es
Bajate los listados para VB3 (Infame.zip 3.9 KB), no te será difícil de modificar para
VB4.
Si lo vas a usar con 32 bits, al final incluyo las declaraciones
del API.
Explicación:
Te escribo para mandarte un truquito, puesto que he visto
en tu página de trucos uno que creo que se puede mejorar,
aunque tu dices: "¡Por fin una forma fácil de
hacerlo!", esta es mucho más fácil aún.
Bueno, mi truco es (vale para todas las versiones de VB):
Declaraciones en un módulo: Global Const WM_SYSCOMMAND = &H112 Global Const SC_MOVE = &HF012 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" () Y el código a añadir en el Form: Sub Form_MouseDown (button As Integer, Shift As Integer, X As Single, Y As Single) Dim res As Long ReleaseCapture res = SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_MOVE, 0) End Sub
y Voilá, ya tienes un verdadero
formulario flotante sin caption que se mueve arrastrándolo por
el área cliente.
Las declaraciones están para Windows 16 Bits, pero no cuesta
nada traducirlas a 32 bits con el API viewer.
Te adjunto un ejemplito tonto ya compilado y con código fuente
para que veas como va en el archivo infame.exe
Por cierto puedes visitar mi página web en http://www.arrakis.es/~malar/ que es la página de un amigo y mia sobre
calculadoras técnicas HP-48, pero desde la cual se accede a mi
página sobre VB. Está en el apartado AntiPasto/Visual basic.
Listados: (en este ejemplo se mueve una imagen por el formulario)
'---Declarac.bas--- Option Explicit Global Const WM_SYSCOMMAND = &H112 Global Const SC_MOVE = &HF012 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" () '---Infame.frm--- Option Explicit Dim dx As Integer Dim dy As Integer Sub Command1_Click () Unload Me End Sub Sub Form_Load () dx = 100 dy = 100 Dim x As Integer, y As Integer Randomize x = Rnd * Me.ScaleWidth y = Rnd * Me.ScaleHeight image1.Move x, y End Sub Sub Form_MouseDown (Button As Integer, Shift As Integer, x As Single, y As Single) Dim res As Long ReleaseCapture res = SendMessage(Me.hWnd, WM_SYSCOMMAND, SC_MOVE, 0) End Sub Sub Timer1_Timer () If image1.Left + image1.Width >= Me.ScaleWidth Then dx = -100 If image1.Left <= 0 Then dx = 100 If image1.Top + image1.Height > Me.ScaleHeight Then dy = -100 If image1.Top < 0 Then dy = 100 image1.Move image1.Left + dx, image1.Top + dy End Sub
Las declaraciones para el API de 32 bits:
Declare Function ReleaseCapture Lib "User32" Alias "ReleaseCapture" () As Long 'para usarlo en este ejemplo: 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