Implémentation d'espaces de travail dans des contrôles de liste
Par défaut, un contrôle de liste réorganise tous les éléments sous forme de grille standard. Toutefois, une autre méthode est prise en charge, à savoir les zones de travail qui réorganisent les éléments de liste en groupes rectangulaires. Pour obtenir une image d’un contrôle de liste qui implémente des zones de travail, consultez Utilisation de contrôles d’affichage de liste dans le Kit de développement logiciel (SDK) Windows.
Remarque
Les zones de travail sont visibles uniquement lorsque le contrôle de liste est en mode icône ou petite icône. Toutefois, les zones de travail actives sont conservées si la vue passe en mode de rapport ou de liste.
Les zones de travail peuvent être utilisées pour afficher une bordure vide (à gauche, en haut et/ou à droite des éléments), ou forcer l'affichage d'une barre de défilement horizontale lorsqu'il n'y en a pas normalement. Une autre utilisation courante consiste à créer plusieurs zones de travail dans lesquelles des éléments peuvent être déplacés ou déposés. Avec cette méthode, vous pouvez créer des zones dans une vue unique avec différentes significations. L'utilisateur peut ensuite classer les éléments en les plaçant dans une autre zone. La vue d'un système de fichiers avec une zone pour les fichiers en lecture/écriture et une autre zone pour les fichiers en lecture seule en est un exemple. Si un élément de fichier a été déplacé dans la zone en lecture seule, il passe automatiquement en lecture seule. Le déplacement d'un fichier de la zone en lecture seule vers la zone en lecture/écriture rend le fichier accessible en lecture/écriture.
CListCtrl
fournit plusieurs fonctions membres pour créer et gérer les zones de travail dans votre contrôle de liste. GetWorkAreas et SetWorkAreas récupèrent et définissent un tableau d’objets (ou RECT
structures), qui stockent les zones de travail actuellement implémentées pour votre contrôle de CRect
liste. En outre, GetNumberOfWorkAreas récupère le nombre actuel de zones de travail pour votre contrôle de liste (par défaut, zéro).
Éléments et zones de travail
Lorsqu'une zone de travail est créée, les éléments qui s'y trouvent en deviennent membres. De même, si un élément est déplacé dans une zone de travail, il devient membre de la zone de travail dans laquelle il a été déplacé. Si un élément ne se trouve dans aucune zone de travail, il devient automatiquement membre de la première zone de travail (index 0). Si vous souhaitez créer un élément et le placer dans une zone de travail spécifique, vous devez créer l’élément, puis le déplacer dans la zone de travail souhaitée avec un appel à SetItemPosition. Le deuxième exemple ci-dessous montre cette technique.
L'exemple suivant implémente quatre zones de travail (rcWorkAreas
), de taille égale avec une bordure de 10 pixels de large autour de chacune d'elles, dans un contrôle de liste (m_WorkAreaListCtrl
).
CSize size;
size = m_WorkAreaListCtrl.ApproximateViewRect();
size.cx += 100;
size.cy += 100;
CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);
//set work areas
m_WorkAreaListCtrl.SetWorkAreas(4, rcWorkAreas);
L’appel à ApproximateViewRect a été effectué pour obtenir une estimation de la zone totale requise pour afficher tous les éléments d’une région. Cette estimation est ensuite divisée en quatre zones et complétée par une bordure de 5 pixels de large.
L’exemple suivant affecte les éléments de liste existants à chaque groupe (rcWorkAreas
) et actualise l’affichage de contrôle (m_WorkAreaListCtrl
) pour terminer l’effet.
// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
rgptWork[i].x = rcWorkAreas[i].left + 10;
rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (int i = 0; i < 20; i++)
{
m_WorkAreaListCtrl.SetItemPosition(i, rgptWork[i % 4]);
}
// force the control to rearrange the shuffled items
m_WorkAreaListCtrl.Arrange(LVA_DEFAULT);