Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado 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.
-
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:
if A <> B then
'aca lo que haces cuando cambia...
B=A
end if
-
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.
-
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)
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