[C con Clase] [Windows API] consulta sobre la implementación de controles header y list view
Salvador Pozo
salvador en conclase.net
Mar Abr 3 10:49:31 CEST 2012
El pasado 2012-03-11 23:22:59, Santiago escribió:
S> Hola. tengo una duda sobre cómo implementar una list view con varios campos
S> de datos, que pueda ser ordenado con un control header.
Hola:
No he sido capaz de compilar tu programa, no sé qué hacen los compiladores de MS con el código. :)
Para ordenar las líneas de un listview hay que usar la macro ListView_SortItems o el mensaje LVM_SORTITEMS.
Te traduzco la ayuda del API para esta macro:
----8<------
La macro ListView_SortItems usa una función de comparación definida por la aplicación para ordenar los items en un control list view. El índice de cada item cambia para reflejar la nueva secuencia. Se puede usar esta macro o enviar explícitamente el mensaje LVM_SORTITEMS.
BOOL ListView_SortItems(
HWND hwnd,
PFNLVCOMPARE pfnCompare,
LPARAM lParamSort
);
Parámetros
hwnd: manipulador del control list view.
pfnCompare: puntero a la función de comparación definida por la aplicación. Esta función es invocada durante la operación de ordenamiento cada vez que el orden relativo de dos items de la lista necesiten ser comparados.
lParamSort: valor definido por la aplicación que es pasado a la función de comparación.
Valores de retorno
Devuelve TRUE si tiene éxito o FALSE en otro caso.
Observaciones
La función de comparación tiene el formato siguiente:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);
El parámetro lParam1 es el valor de 32 bits asociado con el primer ítem a comparar; y el parámetro lParam2 es el valor asociado con el segundo ítem. Estos son los valores que fueron especificados en el parámetro lParam de la estructura del ítem LV_ITEM cuando fue insertado en la lista. El parámetro lParamSort es el mismo valor pasado al mensaje LVM_SORTITEMS.
La función de comparación debe retornar un valor negativo si el primer ítem debe preceder al segundo, un valor positivo si el primer ítem debe seguir al segundo, o cero si los dos ítems son equivalentes.
---8<------
La complicación puede ser buscar los valores de la columna que se están ordenando disponiendo sólo del valor de 32 bits asociado.
Lo normal es almacenar un array con los valores de todas las filas y columnas del list view y usar el índice como valor de 32 bits asociado, aunque eso es sólo una de las opciones, es posible que se te ocurran opciones más imaginativas o más sencillas para tu caso particular.
Suerte.
--
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
Más información sobre la lista de distribución Cconclase