Implementando áreas de trabalho em controles de lista
Por padrão, um controle de lista organiza todos os itens em uma forma de grade padrão. No entanto, há suporte para outro método, áreas de trabalho, que organiza os itens de lista em grupos retangulares. Para uma imagem de um controle de lista que implementa áreas de trabalho, confira Como usar controles de modo de exibição de lista no SDK do Windows.
Observação
As áreas de trabalho só ficam visíveis quando o controle de lista está no modo de ícone ou ícone pequeno. No entanto, todas as áreas de trabalho atuais serão mantidas se a exibição for alternada para o modo de relatório ou lista.
As áreas de trabalho podem ser usadas para exibir uma borda vazia (à esquerda, superior e/ou direita dos itens) ou fazer com que uma barra de rolagem horizontal seja exibida quando normalmente não haveria uma. Outro uso comum é criar várias áreas de trabalho para as quais os itens podem ser movidos ou nas quais podem ser largados. Com esse método, você pode criar áreas em uma só exibição que com significados diferentes. O usuário poderia categorizar os itens colocando-os em uma área diferente. Um exemplo disso seria uma exibição de um sistema de arquivos que tem uma área para arquivos de leitura/gravação e outra área para arquivos somente leitura. Se um item de arquivo fosse movido para a área somente leitura, ele se tornaria automaticamente somente leitura. Mover um arquivo da área somente leitura para a área de leitura/gravação faria com que o arquivo fosse lido/gravado.
CListCtrl
fornece várias funções de membro para criar e gerenciar áreas de trabalho em seu controle de lista. GetWorkAreas e SetWorkAreas recuperam e definem uma matriz de objetos CRect
(ou estruturas RECT
), que armazenam as áreas de trabalho atualmente implementadas para o controle de lista. Além disso, GetNumberOfWorkAreas recupera o número atual de áreas de trabalho para o controle de lista (por padrão, zero).
Itens e áreas de trabalho
Quando uma área de trabalho é criada, os itens que estão dentro dela se tornam seus membros. Da mesma forma, se um item for movido para uma área de trabalho, ele se tornará um membro da área de trabalho para a qual foi movido. Se um item não estiver em nenhuma área de trabalho, ele se tornará automaticamente um membro da primeira área de trabalho (índice 0). Se você quiser criar um item e colocá-lo dentro de uma área de trabalho específica, será necessário criar o item e movê-lo para a área de trabalho desejada com uma chamada para SetItemPosition. O segundo exemplo abaixo demonstra essa técnica.
O exemplo a seguir implementa quatro áreas de trabalho (rcWorkAreas
), de tamanho igual com uma borda de 10 pixels de largura em torno de cada área de trabalho, em um controle 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);
A chamada para ApproximateViewRect foi feita para obter uma estimativa da área total necessária para exibir todos os itens em uma região. Essa estimativa é então dividida em quatro regiões e adicionada com uma borda de 5 pixels de largura.
O próximo exemplo atribui os itens de lista existentes a cada grupo (rcWorkAreas
) e atualiza a exibição de controle (m_WorkAreaListCtrl
) para concluir o efeito.
// 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);