Título: Posición y medidas de un objeto en pantalla a través de su handle
Publicado por: gulabyte en 22 Julio 2008, 23:04 pm
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
Título: Re: Posición y medidas de un objeto en pantalla a través de su handle
Publicado por: seba123neo en 22 Julio 2008, 23:30 pm
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.
Título: Re: Posición y medidas de un objeto en pantalla a través de su handle
Publicado por: gulabyte en 23 Julio 2008, 01:56 am
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
|