Verwenden von List-View Arbeitsbereichen
In diesem Thema wird veranschaulicht, wie Sie mit Arbeitsbereichen für Listenansichten arbeiten. Arbeitsbereiche sind rechteckige virtuelle Bereiche, die zum Anordnen von Elementen in einem Listenansichtssteuerelement verwendet werden können. Ein Arbeitsbereich ist kein Fenster und kann keinen sichtbaren Rahmen aufweisen. Standardmäßig verfügt das Listenansicht-Steuerelement über keine Arbeitsbereiche. Indem Sie einen Arbeitsbereich erstellen, können Sie links, oben oder rechts von den Elementen einen leeren Rahmen erstellen oder eine horizontale Bildlaufleiste anzeigen lassen, wenn normalerweise keine vorhanden wäre.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Programmierung der Windows-Benutzeroberfläche
Anweisungen
Erstellen eines Arbeitsbereichs
Im folgenden C++-Codebeispiel wird veranschaulicht, wie Sie einen Arbeitsbereich mit einem leeren Rahmen von 25 Pixeln oben, links und rechts erstellen.
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;
}
Erstellen mehrerer Arbeitsbereiche
Im folgenden C++-Codebeispiel wird veranschaulicht, wie zwei Arbeitsbereiche in einem Steuerelement erstellt werden. Jeder Arbeitsbereich verwendet etwa die Hälfte des Clientbereichs und ist von einem 25 Pixel großen leeren Rahmen umgeben.
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;
}
Bestimmen des Arbeitsbereichs, zu dem ein Element gehört
Eine Möglichkeit zum Bestimmen des Arbeitsbereichs, zu dem ein Element gehört, besteht darin, folgendes zu tun:
- Ruft die Liste der Koordinaten aller Arbeitsbereiche im Listenansicht-Steuerelement ab.
- Ruft die Koordinaten des Elements ab.
- Bestimmen Sie, ob die Elementkoordinaten innerhalb der Koordinaten eines der Arbeitsbereiche liegen.
Die anwendungsdefinierte Funktion im folgenden C++-Codebeispiel gibt den Index des Arbeitsbereichs zurück, zu dem das Element gehört. Wenn die Funktion fehlschlägt, wird –1 zurückgegeben. Wenn die Funktion erfolgreich ist, sich das Element jedoch nicht in einem der Arbeitsbereiche befindet, gibt die Funktion 0 zurück, da alle Elemente, die sich nicht innerhalb eines Arbeitsbereichs befinden, automatisch zu einem Mitglied des Arbeitsbereichs 0 werden.
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;
}
Zugehörige Themen