problema: obtener Rect de un item de ListView

Iniciado por <[(x)]>, 13 Abril 2009, 04:57 AM

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

<[(x)]>

holas

   Como dije lo q busco es obtener la la estructura rect de un item de un ListView x. Me puse a ver un cacho y logre sacar este code.

Código (vb) [Seleccionar]

Public Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Public Declare Function GetParent Lib "user32" (ByVal Hwnd As Long) As Long



Public Function tapRectItem(ByVal lnghWnd As Long, ByVal Index As Integer)

Dim lRet As Long
Dim tRec As RECT

lRet = SendMessage(lnghWnd, LVM_GETITEMRECT, Index, VarPtr(tRec))
   


With Form1.Picture1
 
  .Top = tRec.Top
  .Left = tRec.Left
  .Height = tRec.Bottom - tRec.Top
  .Width = tRec.Right - tRec.Left

  .Visible = True
  lRet = SetParent(.Hwnd, lnghWnd)
End With

End Function


El  problema es que no me carga la variable 'trec' con los valores.

Espero puedan ayudarme y desde ya gracias --<[(x)]>-..

<[(x)]>

LeandroA

Hola a como no declares las varibles mucho no va a funcionar  ;)

y bueno si es que la declaraste el problema es como declaraste SendMessage

Option Explicit

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type


Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMRECT As Long = (LVM_FIRST + 14)

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal Hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                            (ByVal Hwnd As Long, _
                            ByVal wMsg As Long, _
                            ByVal wParam As Long, _
                            lParam As Any) As Long


Public Function tapRectItem(ByVal lnghWnd As Long, ByVal Index As Integer)

Dim lRet As Long
Dim tRec As RECT

lRet = SendMessage(lnghWnd, LVM_GETITEMRECT, Index, tRec)

Debug.Print tRec.Right, tRec.Bottom

With Form1.Picture1

  .Top = tRec.Top
  .Left = tRec.Left
  .Height = tRec.Bottom - tRec.Top
  .Width = tRec.Right - tRec.Left

  .Visible = True
  lRet = SetParent(.Hwnd, lnghWnd)
End With

End Function


bueno a como veo esto te digo, el formulario tiene que estar Me.ScaleMode = vbPixels o bien llevar las cordenadas a escala.
igual hacer esto es una chanchada porque en cuanto agas un scroll sobre el listview el picture va a pasar por devajo de este.
y si pensas hacer esto para un listview externo a tu aplicacion no te va a funcionar.

Saludos

BlackZeroX

#2
mmm ya se me adelanto LeandroA...¡! bueno ya ni que.

para que veas si cambia el pinture de tamaño solo convierte en comentario esta linea:

Código (vb) [Seleccionar]
lRet = SetParent(.Hwnd, lnghWnd)

...¡!

Dulces Lunas.!¡
The Dark Shadow is my passion.

<[(x)]>

mmm
 
gracias
y conocen alguna forma para hacer esto con un listview externo a mi aplicación??


<[(x)]>

xkiz ™

perdon si me mando cualquiera, pero proba con FindWindow...

LeandroA

Hola para obtener el Rect de un item de un listview externo fijate este ejemplo mira dentro del modulo MdlListview tenes una funcion que te crea un array con el caption y el rect de cada item del listview, eso si, tenes que pasarle el hwnd del listview ya que este utiliza el del escritorio.

Saludos

<[(x)]>



Muchisisismas Gracias LeandroA es exactamente lo q buscaba . ;-)
<[(x)]>