Cómo puedo obtener la posición de un objeto en pantalla y las medidas para luego crear un RECT (rectángulo) donde pueda restringir el cursor.
Algo como GetObjectDimensions (ByVal hWnd As Long) As RECT
o GetObjectTop, GetObjectLeft, Width y Heigh para luego crear el RECT manualmente.
Lo que necesito es alguna funcíon que devuelva la posición y medidas de un objeto mediante su handle.
Salu10 y Gracias de antemano
Hola,si vos queres restringir el cursor a un determinado control podes usar esto...es del api-guide:
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type
Private Type POINT
x As Long
y As Long
End Type
Private Declare Sub ClipCursor Lib "user32" (lpRect As Any)
Private Declare Sub GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT)
Private Declare Sub ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINT)
Private Declare Sub OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long)
Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Command1.Caption = "Limit Cursor Movement"
Command2.Caption = "Release Limit"
End Sub
Private Sub Command1_Click()
'Limits the Cursor movement to within the form.
Dim client As RECT
Dim upperleft As POINT
'Get information about our wndow
GetClientRect Picture1.hWnd, client
upperleft.x = client.left
upperleft.y = client.top
'Convert window coördinates to screen coördinates
ClientToScreen Picture1.hWnd, upperleft
'move our rectangle
OffsetRect client, upperleft.x, upperleft.y
'limit the cursor movement
ClipCursor client
End Sub
Private Sub Command2_Click()
'Releases the cursor limits
ClipCursor ByVal 0&
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Releases the cursor limits
ClipCursor ByVal 0&
End Sub
cambia Me por el control, que quieras...que tenga handle..
saludos.
Gracias seba123neo, la clave era la función GetClientRect, para conseguir el rectángulo del objeto y después ClientToScreen para conseguir el punto del objeto y finalmente el OffsetRect para colocar al rectángulo.
Dejo el código para si alguien le sirve:
Public Sub Restringir(handle As Long)
Dim ObjectRect As RECT 'Declaramos el rectangulo (type RECT)
Dim Point As POINTAPI 'Declaramos el punto (el que será punto de partida del rectángulo, de ahí para la izquierda y para abajo)
GetClientRect handle, ObjectRect 'Obtenemos el rectángulo del objeto a través de su handle
ClientToScreen handle, Point 'Obtenemos el punto donde está colocado el objeto a través del handle
OffsetRect ObjectRect, Point.x, Point.y 'Recreamos el rectángulo esta vez colocándolo donde esta el objeto al que queremos restringir
Call ClipCursor(ObjectRect) 'Llamamos a la función que limita el cursor al rectángulo que hemos creado
' Si quisieramos que esto fuera realmente efectivo, que no se interrumpiera al hacer click, o al pasar a otro foco, etc... podríamos meter
' la función ClipCursor en un timer para que se repitiera consecutivamente sin tener porque crear otra vez el rectángulo.
End Sub
este es el sub para restringir el cursor al objeto mediante su hanlde
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Izquierda As Long
Arriba As Long
Derecha As Long
Abajo As Long
End Type
estos son los tipos del punto y el rectángulo
Private Declare Sub GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT)
Private Declare Sub OffsetRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long)
Private Declare Function ClipCursor Lib "user32" (lpRect As RECT) As Long
Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
las funciones que hay que declarar para restringir, creo que no me dejo ni una
a y gracias otra vez por la rápida respuesta