Udostępnij za pośrednictwem


Jak używać obszarów roboczych List-View

W tym temacie przedstawiamy, jak pracować z obszarami roboczymi widoku listy. Obszary robocze to prostokątne obszary wirtualne, których można użyć do rozmieszczania elementów w kontrolce widoku listy. Obszar roboczy nie jest oknem i nie może mieć widocznego obramowania. Domyślnie kontrolka widoku listy nie ma obszarów roboczych. Tworząc obszar roboczy, można utworzyć puste obramowanie po lewej, górnej lub prawej stronie elementów albo spowodować wyświetlenie poziomego paska przewijania, gdy normalnie by się go nie wyświetlało.

Co musisz wiedzieć

Technologie

Warunki wstępne

  • C/C++
  • Programowanie interfejsu użytkownika systemu Windows

Instrukcje

Tworzenie obszaru roboczego

W poniższym przykładzie kodu języka C++ pokazano, jak utworzyć obszar roboczy z pustym obramowaniem 25 pikseli u góry, lewej i prawej strony.

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

Tworzenie wielu obszarów roboczych

W poniższym przykładzie kodu języka C++ pokazano, jak utworzyć dwa obszary robocze w kontrolce. Każdy obszar roboczy zajmuje około połowy obszaru klienta i jest otoczony pustym obramowaniem o szerokości 25 pikseli.

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

Określanie obszaru roboczego, do którego należy element

Jednym ze sposobów określenia obszaru roboczego, do którego należy element, jest wykonanie następujących czynności:

  • Pobierz listę współrzędnych wszystkich obszarów roboczych w kontrolce widoku listy.
  • Pobierz współrzędne elementu.
  • Ustal, czy współrzędne elementu znajdują się we współrzędnych jednego z obszarów roboczych.

Funkcja zdefiniowana przez aplikację w poniższym przykładzie kodu C++ zwraca indeks obszaru roboczego, do którego należy element. Jeśli funkcja zakończy się niepowodzeniem, zwraca wartość –1. Jeśli funkcja powiedzie się, ale element nie znajduje się wewnątrz żadnej strefy roboczej, funkcja zwraca wartość 0, ponieważ wszystkie elementy, które nie znajdują się w strefie roboczej, automatycznie stają się częścią obszaru roboczego 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;
}

odniesienie kontrolne List-View

informacje o kontrolkach List-View

Korzystanie z elementów sterujących List-View