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

ir al índice