Implementação de áreas em controles de lista de trabalho
Por padrão, um controle de lista organiza todos os itens em um modo de grade padrão.No entanto, outro método é suportado, trabalhando áreas, que organiza os itens da lista em grupos retangulares.Para uma imagem de um controle de lista que implementa a áreas de trabalho, consulte usar controles de exibição de lista no Windows SDK.
Observação: |
---|
Áreas de trabalho são visível somente quando o controle de lista está em ícone ou modo de ícone pequeno.No entanto, as áreas de trabalho corrente são mantidas se o modo é alternado para o modo de relatório ou lista. |
Áreas de trabalho podem ser usadas para exibir uma borda vazia (em da esquerda, e/parte superior ou direita dos itens) ou fazer com que uma BAR de rolar horizontal a ser exibido quando normalmente não haver um.Outro uso comum é criar várias áreas de trabalho às quais itens podem ser movidos ou descartados.Com esse método, você poderia criar áreas em um único modo de exibição que possuem significados diferentes.O usuário, em seguida, pode categorizar os itens, colocando-as em uma área diferente.Um exemplo disso seria um modo de exibição de um sistema de arquivos que tem uma área para arquivos de leitura/gravar e outra área para arquivos somente leitura.Se um item do arquivo foram movido para a área de somente leitura, ele automaticamente seria somente leitura.Movendo um arquivo de área de somente leitura para a área de leitura/gravar tornaria o arquivo de leitura/gravar.
CListCtrl fornece várias funções de membro para criar e gerenciar áreas de trabalho no seu controle de lista. GetWorkAreas and SetWorkAreas recuperar e conjunto uma matriz de CRect objetos (ou RECT estruturas), que armazenam as áreas de trabalho implementado atualmente para o controle de lista. Além disso, GetNumberOfWorkAreas recupera o número corrente de áreas de trabalho para o controle de lista (por padrão, zero).
Os itens e áreas de trabalho
Quando uma área de trabalho é criada, itens que estiverem na área de trabalho se tornar membros do mesmo.Da mesma forma, se um item é movido para uma área de trabalho, ele se torna um membro da área de trabalho ao qual ele foi movido.Se um item não fique na qualquer área de trabalho, ele automaticamente se torna um membro da primeira área de trabalho (índice 0).Se você desejar criar um item e fazer com que ele colocados dentro de uma área de trabalho específica, será necessário criar o item e, em seguida, mova-o para a área de trabalho desejada com uma telefonar para SetItemPosition.O segundo exemplo a seguir demonstra essa técnica.
O exemplo a seguir implementa quatro áreas de trabalho (rcWorkAreas), de dimensionar igual com uma borda de pixel-toda a 10 ao redor de cada área de trabalho, em uma lista de controle ()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 telefonar para ApproximateViewRect foi feita para ter uma estimativa da área total necessária para exibir todos os itens em uma região.Essa estimativa será dividida em quatro regiões e preenchida com uma borda de 5 pixels-toda.
The next example assigns the existing list items to each group (rcWorkAreas) and refreshes the control view (m_WorkAreaListCtrl) to complete the effect.
// 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);