Posición y medidas de un objeto en pantalla a través de su handle

Iniciado por gulabyte, 22 Julio 2008, 23:04 PM

0 Miembros y 1 Visitante están viendo este tema.

gulabyte


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

seba123neo

Hola,si vos queres restringir el cursor a un determinado control podes usar esto...es del api-guide:

Código (vb) [Seleccionar]
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.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

gulabyte


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