Uso de áreas de trabajo de List-View
En este tema se muestra cómo trabajar con áreas de trabajo de vista de lista. Las áreas de trabajo son áreas virtuales rectangulares que se pueden usar para organizar elementos en un control de vista de lista. Un área de trabajo no es una ventana y no puede tener un borde visible. De forma predeterminada, el control de vista de lista no tiene áreas de trabajo. Al crear un área de trabajo, puede crear un borde vacío a la izquierda, la parte superior o la derecha de los elementos o hacer que se muestre una barra de desplazamiento horizontal cuando normalmente no habría una.
Lo que necesita saber
Tecnologías
Requisitos previos
- C/C++
- Programación de la interfaz de usuario de Windows
Instrucciones
Crear un área de trabajo
En el ejemplo de código de C++ siguiente se muestra cómo crear un área de trabajo con un borde vacío de 25 píxeles en sus lados superior, izquierdo y derecho.
void SetWorkAreas1(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
GetClientRect(hWndListView, &rcClient);
rcClient.left += EMPTY_SPACE;
rcClient.top += EMPTY_SPACE;
rcClient.right -= (EMPTY_SPACE * 2);
SendMessage(hWndListView, LVM_SETWORKAREAS, 1, (LPARAM)&rcClient);
return;
}
Crear varias áreas de trabajo
En el ejemplo de código de C++ siguiente se muestra cómo crear dos áreas de trabajo en un control . Cada área de trabajo usa aproximadamente la mitad del área de cliente y está rodeada por un borde vacío de 25 píxeles.
void SetWorkAreas2(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
RECT rcWork[2];
GetClientRect(hWndListView, &rcClient);
rcWork[0].left = rcClient.left + EMPTY_SPACE;
rcWork[0].top = rcClient.top + EMPTY_SPACE;
rcWork[0].right = (rcClient.right/2) - EMPTY_SPACE;
rcWork[0].bottom = rcClient.bottom;
rcWork[1].left = (rcClient.right/2) + EMPTY_SPACE;
rcWork[1].top = rcClient.top + EMPTY_SPACE;
rcWork[1].right = rcClient.right - EMPTY_SPACE;
rcWork[1].bottom = rcClient.bottom;
SendMessage(hWndListView, LVM_SETWORKAREAS, 2, (LPARAM)rcWork);
return;
}
Determinar el área de trabajo a la que pertenece un elemento
Una manera de determinar qué área de trabajo pertenece un elemento es hacer lo siguiente:
- Recupere la lista de coordenadas de todas las áreas de trabajo del control de vista de lista.
- Recupere las coordenadas del elemento.
- Determine si las coordenadas del elemento se encuentran dentro de las coordenadas de una de las áreas de trabajo.
La función definida por la aplicación en el siguiente ejemplo de código de C++ devuelve el índice del área de trabajo a la que pertenece el elemento. Si se produce un error en la función, devuelve –1. Si la función se ejecuta correctamente, pero el elemento no está dentro de ninguna de las áreas de trabajo, la función devuelve 0, porque todos los elementos que no están dentro de un área de trabajo se convierten automáticamente en un miembro del área de trabajo cero.
int GetItemWorkingArea(HWND hWndListView, int iItem)
{
UINT uWorkAreas = 0;
int nReturn = -1;
LPRECT pRects;
POINT pt;
if(!ListView_GetItemPosition(hWndListView, iItem, &pt))
return nReturn;
ListView_GetNumberOfWorkAreas(hWndListView, &uWorkAreas);
if(uWorkAreas)
{
pRects = (LPRECT)GlobalAlloc(GPTR, sizeof(RECT) * uWorkAreas);
if(pRects)
{
UINT i;
nReturn = 0;
ListView_GetWorkAreas(hWndListView, uWorkAreas, pRects);
for(i = 0; i < uWorkAreas; i++)
{
if(PtInRect((pRects + i), pt))
{
nReturn = i;
break;
}
}
GlobalFree((HGLOBAL)pRects);
}
}
return nReturn;
}
Temas relacionados