Implementieren von Arbeitsbereichen in Listensteuerelementen
Standardmäßig ordnet ein Listensteuerelement alle Elemente in einer standardmäßigen Rasterart an. Eine andere Methode wird jedoch unterstützt, Arbeitsbereiche, die die Listenelemente in rechteckige Gruppen anordnen. Ein Bild eines Listensteuerelements, das Arbeitsbereiche implementiert, finden Sie unter Verwenden von Listenansichtssteuerelementen im Windows SDK.
Hinweis
Arbeitsbereiche sind nur sichtbar, wenn sich das Listensteuerelement im Symbol- oder kleinen Symbolmodus befindet. Alle aktuellen Arbeitsbereiche werden jedoch Standard beibehalten, wenn die Ansicht in den Bericht- oder Listenmodus gewechselt wird.
Arbeitsbereiche können verwendet werden, um einen leeren Rahmen (auf der linken, oberen und/oder rechten Seite der Elemente) anzuzeigen, oder es wird eine horizontale Bildlaufleiste angezeigt, wenn normalerweise keins vorhanden wäre. Eine weitere häufige Verwendung besteht darin, mehrere Arbeitsbereiche zu erstellen, in die Elemente verschoben oder gelöscht werden können. Mit dieser Methode können Sie Bereiche in einer einzigen Ansicht erstellen, die unterschiedliche Bedeutungen haben. Der Benutzer könnte die Elemente dann kategorisieren, indem er sie in einem anderen Bereich platziert. Ein Beispiel hierfür wäre eine Ansicht eines Dateisystems, das einen Bereich für Lese-/Schreibdateien und einen anderen Bereich für schreibgeschützte Dateien enthält. Wenn ein Dateielement in den schreibgeschützten Bereich verschoben wurde, wird es automatisch schreibgeschützt. Wenn Sie eine Datei aus dem schreibgeschützten Bereich in den Lese-/Schreibbereich verschieben, würde die Datei lese-/schreibzugriff.
CListCtrl
stellt mehrere Memberfunktionen zum Erstellen und Verwalten von Arbeitsbereichen in Ihrem Listensteuerelement bereit. GetWorkAreas und SetWorkAreas rufen ein Array von CRect
Objekten (oder RECT
Strukturen) ab, die die aktuell implementierten Arbeitsbereiche für Ihr Listensteuerelement speichern. Darüber hinaus ruft GetNumberOfWorkAreas die aktuelle Anzahl der Arbeitsbereiche für Ihr Listensteuerelement ab (standardmäßig Null).
Elemente und Arbeitsbereiche
Wenn ein Arbeitsbereich erstellt wird, werden Elemente, die sich innerhalb des Arbeitsbereichs befinden, zu Mitgliedern des Arbeitsbereichs. Wenn ein Element in einen Arbeitsbereich verschoben wird, wird es zu einem Mitglied des Arbeitsbereichs, in den es verschoben wurde. Wenn ein Element nicht innerhalb eines Arbeitsbereichs liegt, wird es automatisch mitglied des ersten (Index 0)-Arbeitsbereichs. Wenn Sie ein Element erstellen und in einem bestimmten Arbeitsbereich platzieren möchten, müssen Sie das Element erstellen und dann mit einem Aufruf von SetItemPosition in den gewünschten Arbeitsbereich verschieben. Im zweiten Beispiel unten wird diese Technik veranschaulicht.
Im folgenden Beispiel werden vier Arbeitsbereiche (rcWorkAreas
), die gleich groß sind, mit einem 10 Pixel breiten Rahmen um jeden Arbeitsbereich in einem Listensteuerelement (m_WorkAreaListCtrl
) implementiert.
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);
Der Aufruf von ApproximateViewRect wurde durchgeführt, um eine Schätzung des Gesamtbereichs zu erhalten, der zum Anzeigen aller Elemente in einer Region erforderlich ist. Diese Schätzung wird dann in vier Bereiche unterteilt und mit einem 5 Pixel breiten Rahmen aufgefüllt.
Im nächsten Beispiel werden die vorhandenen Listenelemente jeder Gruppe (rcWorkAreas
) zugewiesen und die Steuerelementansicht (m_WorkAreaListCtrl
) aktualisiert, um den Effekt abzuschließen.
// 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);