Implémenter des emplacements de travail dans les contrôles de liste
Par défaut, un contrôle de liste réorganise tous les éléments de manière standard de grille.Toutefois, une autre méthode est prise en charge, des emplacements de travail, qui organise les éléments de liste en groupes rectangulaires.Pour une image d'un contrôle de liste qui implémente des emplacements de travail, consultez à l'utilisation de contrôles liste view dans Kit de développement logiciel Windows.
[!REMARQUE]
Les emplacements de travail sont visibles uniquement lorsque le contrôle de liste est en mode d'icône ou d'une petite icône.Toutefois, tous les emplacements de travail en cours sont conservés si la vue est basculer vers au mode d'état ou de liste.
Les emplacements de travail peuvent être utilisés pour afficher une bordure vide (à gauche, supérieur et/ou à droite des éléments), ou génèrent une barre de défilement horizontale à afficher lorsqu'il normalement n'existe pas d'une.Une autre utilisation courante consiste à créer plusieurs emplacements de travail auxquels les éléments peuvent être déplacés ou supprimés.Avec cette méthode, vous pouvez créer des zones dans une vue unique qui ont des significations différentes.L'utilisateur peut ensuite classer les éléments en les plaçant dans une autre zone.Un exemple de cette séquence est une vue d'un système de fichiers qui possède une zone pour les fichiers en lecture/écriture et une zone différente pour les fichiers en lecture seule.Si un élément du fichier sont déplacés vers la zone en lecture seule, il deviendrait automatiquement en lecture seule.Déplaçant un fichier de la zone en lecture seule dans la zone en lecture/écriture ferait la lecture/écriture de fichier.
CListCtrl fournit plusieurs fonctions membres pour créer et gérer des emplacements de travail dans votre contrôle liste.GetWorkAreas et SetWorkAreas récupèrent et définissent un tableau d'objets d' CRect (ou de structures d' RECT ), qui signalent les emplacements de travail actuellement implémentés pour votre contrôle de liste.En outre, GetNumberOfWorkAreas extrait nombre d'emplacements de travail pour votre contrôle de liste (par défaut, zéro).
Éléments et emplacements de travail
Lorsqu'un emplacement de travail est créé, les éléments qui se trouvent se trouve dans l'emplacement de travail deviennent des membres de celle-ci.De même, si un élément est déplacé dans un emplacement de travail, il devient un membre de l'emplacement de travail auquel il a été déplacé.Si un élément ne se trouve pas se trouve à tout emplacement de travail, il devient automatiquement à un membre du premier (index 0) emplacement de travail.Si vous souhaitez créer un élément et le rendre placer dans un emplacement de travail spécifique, vous devez créer l'élément puis la déplacer dans l'emplacement de travail désiré avec un appel à SetItemPosition.Le deuxième exemple ci-dessous illustre cette technique.
L'exemple suivant implémente quatre emplacements de travail (rcWorkAreas), de taille égale avec une bordure 10 largeur d'un pixel autour de chaque zone de travail, dans un contrôle 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 avez essayé d'obtenir une évaluation de la surface totale requise pour afficher tous les éléments dans une zone.Cette évaluation est ensuite divisée en quatre zones et effectuée avec une bordure 5 pixel de large.
L'exemple suivant assigne les éléments de liste existants à chaque groupe (rcWorkAreas) et actualiser 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);