Implementar las áreas de trabajo en los controles de lista
De forma predeterminada, un control de lista organiza todos los elementos de un modo estándar de la cuadrícula. Sin embargo, se admiten otro método, zonas de trabajo, que organiza los elementos de lista en grupos rectangulares. Para una imagen de un control de lista que implemente zonas de trabajo, vea Controles de vista de lista de Utilizar en Windows SDK.
Nota |
---|
Las zonas de trabajo solo pueden verse cuando el control de lista está en icono o pequeño para el icono.Sin embargo, se mantiene una zona de trabajo actual si la vista se cambia al informe o el modo enumerado. |
Las zonas de trabajo se pueden utilizar para mostrar un borde vacío (en el izquierdo, superior y derecho de elementos), o produce una barra de desplazamiento horizontal que se mostrará cuando no haya ningún normalmente una. Otro uso común es crear zonas de trabajo varias a qué elementos se pueden mover o quitar. Con este método, se podría crear áreas en una vista única que tienen significados diferentes. El usuario podría a clasificar los elementos colocándolos en otra área. Un ejemplo de esto sería una vista de un sistema de archivos que tiene un área para los archivos de lectura/escritura y otra área para los archivos de solo lectura. Si un elemento file fuera movido al área de solo lectura, automáticamente protegió a ser de sólo lectura. Mover un archivo de sólo lectura en el área de lectura y escritura crear la escritura del archivo.
CListCtrl proporciona varias funciones miembro para crear y administrar zonas de trabajo en el control de lista. GetWorkAreas y SetWorkAreas recupera y establece una matriz de los objetos de CRect (o de las estructuras de RECT ), que almacenan las zonas de trabajo actualmente implementadas para el control de lista. Además, GetNumberOfWorkAreas recupera el número actual de zonas de trabajo para el control de lista (de forma predeterminada, cero).
Elementos y zonas de trabajo
Cuando se crea un área de trabajo, los elementos que mienten dentro de la zona de trabajo se convierten en miembros de ella. De igual forma, si un elemento se mueve a un área de trabajo, se convierte en un miembro de la zona de trabajo a la que se ha movido. Si un elemento no se encuentra dentro de una zona de trabajo, automáticamente se convierte en un miembro de la primera (índice 0) área de trabajo. Si desea crear un elemento y haga colocar dentro de una zona de trabajo concreta, necesitará crear el elemento y después mover esa a la zona de trabajo deseada con una llamada a SetItemPosition. El segundo ejemplo siguiente muestra esta técnica.
El ejemplo siguiente implementa cuatro zonas de trabajo (rcWorkAreas), el tamaño igual con un borde píxel- ancho 10 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 hizo para obtener una estimación de la superficie total necesaria para mostrar todos los elementos de una región. Esta estimación se divide en cuatro regiones y se completa con un borde píxel- ancho 5.
El ejemplo siguiente se asigna los elementos de lista existentes a cada grupo (rcWorkAreas) y actualiza la vista de control (m_WorkAreaListCtrl) para rellenar 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);