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 [email protected]
 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