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;
}

Referência de controle List-View

Sobre controles de exibição de lista

Usando controles de exibição de lista