Implementando áreas de trabalho em controles de lista
Por padrão, um controle de página lista todos os itens em uma forma padrão da grade. Porém, outro método tem suporte, áreas de operação, que organiza os itens de lista em grupos retangulares. Para uma imagem de um controle da lista que implementa áreas de operação, consulte usando controles de exibição de lista em Windows SDK.
Dica
As áreas de trabalho são visíveis apenas quando o controle da lista está no ícone ou o modo de ícone pequeno.Porém, todas as áreas de trabalho atuais são mantidas se a exibição é alternada para o modo de relatório ou na lista.
As áreas de trabalho podem ser usadas para exibir uma borda vazia (na esquerda, e/ou superior direito de itens), ou causar uma barra de rolagem horizontal a ser exibida quando normalmente não haveria uma. Outro uso comum é criar várias áreas de operação para que os itens podem ser movidos ou descartado. Com esse método, você pode criar as áreas em uma única exibição que têm significados diferentes. O usuário pode então categorizar colocando os itens 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 grupos de arquivos somente leitura. Se um item do arquivo foi movido na área somente leitura, iria automaticamente somente leitura. Mover um arquivo da área somente leitura na área de leitura/gravação faz a leitura/gravação do arquivo.
CListCtrl fornece várias funções de membro para criar e gerenciar áreas de operação no controle da lista. GetWorkAreas e SetWorkAreas recuperam e definem uma matriz de objetos CRect (ou as estruturas de RECT ), que armazenam as áreas de operação atualmente implementadas para o controle da lista. Além disso, GetNumberOfWorkAreas recupera o número atual de áreas de trabalho para o controle da lista (por padrão, zero).
Itens e áreas de operação
Quando uma área de trabalho é criada, os itens que residem dentro da área de trabalho se tornam em membros delas. Da mesma forma, se um item é movido em uma área de trabalho, que se torna um membro da área de trabalho a que foi movido. Se um item não residem dentro de uma área de trabalho, se torna automaticamente em um membro da primeira índice (0) área de trabalho. Se você quiser criar um item e para o ter colocado dentro de uma área de trabalho específica, você precisará criar o item e de movê-la na área de trabalho desejada com uma chamada a SetItemPosition. O segundo exemplo a seguir demonstra essa técnica.
O exemplo a seguir implementa quatro áreas de operação (),rcWorkAreasde tamanhos iguais a 10 pixel- larga uma borda em torno de cada área de trabalho, em um controle de listas (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 feito para obter uma estimativa da área total necessária para exibir todos os itens em uma região. Essa estimativa em é dividido em quatro regiões e preenchida com uma borda 5 pixel- larga.
O exemplo a seguir atribui os itens da lista existente para cada gruporcWorkAreas() e a atualizações 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);