Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Noviembre 21, 2011, 03:54:57 pm

Título: Saber si una columna de ListView se re-dimensiona
Publicado por: E N T E R en Noviembre 21, 2011, 03:54:57 pm
Así es como el titulo dice como saber si una columna cambio de tamaño en el control ListView. En un timer no puedo poner por que parpadea los datos que hay en el listview.
Título: Re:Saber si una columna de ListView se re-dimensiona
Publicado por: Mr. X en Noviembre 21, 2011, 04:26:26 pm
Para que no parpadee, poné el formulario en autoredraw=true
guarda en una variable el tamaño de la columna, y con un timer, comproba si cambio. Por ejemplo, supongamos que A es el ancho actual, y B es el anterior:
Código: (vb) [Seleccionar]
if A <> B then
   'aca lo que haces cuando cambia...
   B=A
end if
Título: Re:Saber si una columna de ListView se re-dimensiona
Publicado por: seba123neo en Noviembre 21, 2011, 04:41:40 pm
la mejor forma es sin duda sin timer, me imagino sublcasificando el listview y ahi obtener cuando se cambio la columna de ancho, es un poco engorroso para algo tan simple.
Título: Re:Saber si una columna de ListView se re-dimensiona
Publicado por: raul338 en Noviembre 21, 2011, 06:46:48 pm
Te doy un extracto del ucListView
Tenes que subclasificar el mensaje WM_NOTIFY del listview y obtener el handle del control Header (a travez de SendMessage)
Código: (vb) [Seleccionar]
Private Const HDN_BEGINTRACK       As Long = (HDN_FIRST - 6) 'Ansi
Private Const WM_NOTIFY                As Long = &H4E
Private Const LVM_FIRST                   As Long = &H1000
Private Const LVM_GETHEADER         As Long = (LVM_FIRST + 31)
Private Type NMHDR
    hwndFrom As Long
    idfrom   As Long
    code     As Long
End Type

Private Function LVHeaderHwnd(LV As ListView) As Long
LVHeaderHwnd = SendMessage(LV.hWnd, LVM_GETHEADER, 0, ByVal 0)
End Function

' Filtro de mensajes
Dim uNMH     As NMHDR
If Msg = WM_NOTIFY Then
    Call RtlMoveMemory(VarPtr(uNMH), lParam, Len(uNMH))
    If uNMH.code = HDN_BEGINTRACK And uNMH.hwndFrom = m_hHeader Then
        ' Aca la columna esta cambiando de tamaño
        ' que el mensaje devuelva 1 y manejas vos el mensaje si queres cancelarlo
        ' Si queres saber que columna es, hace un HitTest al header
        If (m_HeaderFixedWidth) Then
            lReturn = 1
            bHandled = True
        End If
    End If
End If