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

Informations de référence sur les contrôles d’affichage de liste

À propos des contrôles List-View

Utilisation de contrôles List-View