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