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;
}
Tematy pokrewne
-
odniesienie kontrolne List-View