Comment utiliser List-View zones de travail
Cette rubrique montre comment utiliser des zones de travail d’affichage de liste. Les zones de travail sont des zones virtuelles rectangulaires qui peuvent être utilisées pour organiser des éléments dans un contrôle d’affichage de liste. Une zone de travail n’est pas une fenêtre et ne peut pas avoir de bordure visible. Par défaut, le contrôle list-view n’a aucune zone de travail. En créant une zone de travail, vous pouvez créer une bordure vide à gauche, en haut ou à droite des éléments ou afficher une barre de défilement horizontale quand il n’y en a pas normalement.
Bon à savoir
Technologies
Prérequis
- C/C++
- Programmation de l’interface utilisateur Windows
Instructions
Créer une zone de travail
L’exemple de code C++ suivant montre comment créer une zone de travail avec une bordure vide de 25 pixels sur ses côtés supérieur, gauche et droit.
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;
}
Créer plusieurs zones de travail
L’exemple de code C++ suivant montre comment créer deux zones de travail dans un contrôle. Chaque zone de travail utilise environ la moitié de la zone cliente et est entourée d’une bordure vide 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;
}
Déterminer la zone de travail à laquelle un élément appartient
Une façon de déterminer à quelle zone de travail appartient un élément consiste à effectuer les opérations suivantes :
- Récupérez la liste des coordonnées de toutes les zones de travail dans le contrôle d’affichage de liste.
- Récupérez les coordonnées de l’élément.
- Déterminez si les coordonnées de l’élément se trouvent dans les coordonnées de l’une des zones de travail.
La fonction définie par l’application dans l’exemple de code C++ suivant retourne l’index de la zone de travail à laquelle appartient l’élément. Si la fonction échoue, elle retourne –1. Si la fonction réussit, mais que l’élément n’est à l’intérieur d’aucune des zones de travail, la fonction retourne 0, car tous les éléments qui ne se trouvent pas à l’intérieur d’une zone de travail deviennent automatiquement membres de la zone de travail zéro.
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;
}
Rubriques connexes