Como usar áreas de trabalho de exibição de lista
Este tópico demonstra como trabalhar com áreas de trabalho de exibição de lista. As áreas de trabalho são áreas virtuais retangulares que podem ser usadas para organizar itens em um controle de exibição de lista. Uma área de trabalho não é uma janela e não pode ter uma borda visível. Por padrão, o controle list-view não tem áreas de trabalho. Ao criar uma área de trabalho, você pode criar uma borda vazia à esquerda, na parte superior ou à direita dos itens ou fazer com que uma barra de rolagem horizontal seja exibida quando normalmente não haveria uma.
O que você precisa saber
Tecnologias
Pré-requisitos
- C/C++
- Programação da interface do usuário do Windows
Instruções
Criar uma área de trabalho
O exemplo de código C++ a seguir demonstra como criar uma área de trabalho com uma borda vazia de 25 pixels em seus lados superior, esquerdo e direito.
void SetWorkAreas1(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
GetClientRect(hWndListView, &rcClient);
rcClient.left += EMPTY_SPACE;
rcClient.top += EMPTY_SPACE;
rcClient.right -= (EMPTY_SPACE * 2);
SendMessage(hWndListView, LVM_SETWORKAREAS, 1, (LPARAM)&rcClient);
return;
}
Criar várias áreas de trabalho
O exemplo de código C++ a seguir demonstra como criar duas áreas de trabalho em um controle. Cada área de trabalho usa cerca de metade da área do cliente e é cercada por uma borda vazia de 25 pixels.
void SetWorkAreas2(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
RECT rcWork[2];
GetClientRect(hWndListView, &rcClient);
rcWork[0].left = rcClient.left + EMPTY_SPACE;
rcWork[0].top = rcClient.top + EMPTY_SPACE;
rcWork[0].right = (rcClient.right/2) - EMPTY_SPACE;
rcWork[0].bottom = rcClient.bottom;
rcWork[1].left = (rcClient.right/2) + EMPTY_SPACE;
rcWork[1].top = rcClient.top + EMPTY_SPACE;
rcWork[1].right = rcClient.right - EMPTY_SPACE;
rcWork[1].bottom = rcClient.bottom;
SendMessage(hWndListView, LVM_SETWORKAREAS, 2, (LPARAM)rcWork);
return;
}
Determinar a área de trabalho à qual um item pertence
Uma maneira de determinar a qual área de trabalho um item pertence é fazer o seguinte:
- Recupere a lista de coordenadas de todas as áreas de trabalho no controle list-view.
- Recupere as coordenadas do item.
- Determine se as coordenadas do item estão dentro das coordenadas de uma das áreas de trabalho.
A função definida pelo aplicativo no exemplo de código C++ a seguir retorna o índice da área de trabalho à qual o item pertence. Se a função falhar, ela retornará –1. Se a função for bem-sucedida, mas o item não estiver dentro de nenhuma das áreas de trabalho, a função retornará 0, porque todos os itens que não estão dentro de uma área de trabalho se tornarão automaticamente membros da área de trabalho zero.
int GetItemWorkingArea(HWND hWndListView, int iItem)
{
UINT uWorkAreas = 0;
int nReturn = -1;
LPRECT pRects;
POINT pt;
if(!ListView_GetItemPosition(hWndListView, iItem, &pt))
return nReturn;
ListView_GetNumberOfWorkAreas(hWndListView, &uWorkAreas);
if(uWorkAreas)
{
pRects = (LPRECT)GlobalAlloc(GPTR, sizeof(RECT) * uWorkAreas);
if(pRects)
{
UINT i;
nReturn = 0;
ListView_GetWorkAreas(hWndListView, uWorkAreas, pRects);
for(i = 0; i < uWorkAreas; i++)
{
if(PtInRect((pRects + i), pt))
{
nReturn = i;
break;
}
}
GlobalFree((HGLOBAL)pRects);
}
}
return nReturn;
}
Tópicos relacionados