Implementar las áreas de trabajo en los controles de lista
De forma predeterminada, un control de lista organiza todos los elementos en una cuadrícula de forma estándar. Sin embargo, se admite otro método, áreas de trabajo, que organiza los elementos de lista en grupos rectangulares. Para obtener una imagen de un control de lista que implementa áreas de trabajo, consulte Uso de controles de List-View en Windows SDK.
Nota:
Las áreas de trabajo solo son visibles cuando el control de lista está en modo icono o icono pequeño. Sin embargo, las áreas de trabajo actuales se mantienen si la vista cambia al modo de informe o lista.
Las áreas de trabajo se pueden usar para mostrar un borde vacío (a la izquierda, en la parte superior o a la derecha de los elementos), o hacer que se muestre una barra de desplazamiento horizontal cuando normalmente no habría ninguna. Otro uso común es crear varias áreas de trabajo a las que se puedan mover los elementos o desde las que se puedan eliminar. Con este método, podría crear áreas en una sola vista que tenga significados diferentes. Después, el usuario podría clasificar los elementos colocándolos en un área diferente. Un ejemplo de esto sería una vista de un sistema de archivos que tiene un área para archivos de lectura y escritura y otra área para archivos de solo lectura. Si un elemento de archivo se moviera al área de solo lectura, se convertiría automáticamente en archivo de solo lectura. Mover un archivo del área de solo lectura al área de lectura y escritura haría que el archivo fuera de lectura y escritura.
CListCtrl
proporciona varias funciones miembro para crear y administrar áreas de trabajo en el control de lista. GetWorkAreas y SetWorkAreas recuperan y establecen una matriz de objetos CRect
(o estructuras RECT
), que almacenan las áreas de trabajo implementadas actualmente para el control de lista. Además, GetNumberOfWorkAreas recupera el número actual de áreas de trabajo del control de lista (de forma predeterminada, cero).
Elementos y áreas de trabajo
Cuando se crea un área de trabajo, los elementos que se encuentran dentro del área de trabajo se convierten en miembros de ella. De forma similar, si un elemento se mueve a un área de trabajo, se convierte en miembro del área de trabajo a la que se movió. Si un elemento no se encuentra dentro de ningún área de trabajo, se convierte automáticamente en miembro de la primera (índice 0). Si desea crear un elemento y colocarlo dentro de un área de trabajo específica, deberá crear el elemento y, a continuación, moverlo al área de trabajo deseada con una llamada a SetItemPosition. Esta técnica se muestra en el segundo ejemplo a continuación.
En el ejemplo siguiente se implementan cuatro áreas de trabajo (rcWorkAreas
), de igual tamaño con un borde de 10 píxeles alrededor de cada área de trabajo, en un control de lista (m_WorkAreaListCtrl
).
CSize size;
size = m_WorkAreaListCtrl.ApproximateViewRect();
size.cx += 100;
size.cy += 100;
CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);
//set work areas
m_WorkAreaListCtrl.SetWorkAreas(4, rcWorkAreas);
La llamada a ApproximateViewRect se realizó para obtener una estimación del área total necesaria para mostrar todos los elementos de una región. Esta estimación se divide en cuatro regiones y se rellena con un borde de 5 píxeles.
En el ejemplo siguiente se asignan los elementos de lista existentes a cada grupo (rcWorkAreas
) y se actualiza la vista de control (m_WorkAreaListCtrl
) para completar el efecto.
// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
rgptWork[i].x = rcWorkAreas[i].left + 10;
rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (int i = 0; i < 20; i++)
{
m_WorkAreaListCtrl.SetItemPosition(i, rgptWork[i % 4]);
}
// force the control to rearrange the shuffled items
m_WorkAreaListCtrl.Arrange(LVA_DEFAULT);