Implementera arbetsområden i listkontroller

Som standard ordnar en listkontroll alla objekt på ett standardrutnät. En annan metod stöds dock, arbetsytor, som ordnar listobjekten i rektangulära grupper. En bild av en listkontroll som implementerar arbetsytor finns i Använda List-View-kontroller i Windows SDK.

Anmärkning

Arbetsytor visas bara när listkontrollen är i ikon eller i litet ikonläge. Alla aktuella arbetsytor behålls dock om vyn växlas till rapport- eller listläget.

Arbetsytor kan användas för att visa en tom kantlinje (till vänster, överst och/eller till höger om objekten) eller orsaka att en vågrät rullningslist visas när det normalt inte skulle finnas någon. En annan vanlig användning är att skapa flera arbetsytor där objekt kan flyttas eller tas bort. Med den här metoden kan du skapa områden i en enda vy som har olika betydelser. Användaren kan sedan kategorisera objekten genom att placera dem i ett annat område. Ett exempel på detta är en vy över ett filsystem som har ett område för läs-/skrivfiler och ett annat område för skrivskyddade filer. Om ett filobjekt flyttades till det skrivskyddade området skulle det automatiskt bli skrivskyddat. Om du flyttar en fil från det skrivskyddade området till läs-/skrivområdet skulle filen bli skrivbar.

CListCtrl innehåller flera medlemsfunktioner för att skapa och hantera arbetsytor i listkontrollen. GetWorkAreas och SetWorkAreas hämtar och anger en matris med CRect objekt (eller RECT strukturer) som lagrar de aktuella implementerade arbetsytorna för listkontrollen. Dessutom hämtar GetNumberOfWorkAreas det aktuella antalet arbetsytor för listkontrollen (som standard noll).

Objekt och arbetsytor

När ett arbetsområde skapas blir objekt som ligger inom arbetsytan medlemmar i den. På samma sätt, om ett objekt flyttas till ett arbetsområde, blir det medlem i arbetsytan som det flyttades till. Om ett objekt inte ligger inom något arbetsområde blir det automatiskt medlem i den första (index 0) arbetsytan. Om du vill skapa ett objekt och placera det inom ett visst arbetsområde måste du skapa objektet och sedan flytta det till önskad arbetsyta med ett anrop till SetItemPosition. Det andra exemplet nedan visar den här tekniken.

I följande exempel implementeras fyra arbetsytor (rcWorkAreas), av samma storlek med en 10 bildpunkts bred kantlinje runt varje arbetsyta, i en listkontroll (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);

Anropet till ApproximateViewRect gjordes för att få en uppskattning av den totala area som krävs för att visa alla objekt i en region. Den här uppskattningen delas sedan in i fyra regioner och vadderas med en kantlinje på 5 bildpunkter.

I nästa exempel tilldelas de befintliga listobjekten till varje grupp (rcWorkAreas) och kontrollvyn (m_WorkAreaListCtrl) uppdateras för att slutföra effekten.

// 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);

Se även

Använda CListCtrl
Kontroller