Implementace pracovních oblastí v ovládacích prvcích seznam
Ve výchozím nastavení ovládací prvek seznamu uspořádá všechny položky standardním způsobem mřížky. Podporuje se však jiná metoda, pracovní oblasti, která uspořádá položky seznamu do obdélníkových skupin. Obrázek ovládacího prvku seznamu, který implementuje pracovní oblasti, naleznete v tématu Použití ovládacích prvků Zobrazení seznamu v sadě Windows SDK.
Poznámka
Pracovní oblasti jsou viditelné jenom v případech, kdy je ovládací prvek seznamu v režimu ikony nebo malé ikony. Pokud se ale zobrazení přepne do režimu sestavy nebo seznamu, zachovají se všechny aktuální pracovní oblasti.
Pracovní oblasti se dají použít k zobrazení prázdného ohraničení (vlevo, nahoře nebo vpravo od položek) nebo k zobrazení vodorovného posuvníku, pokud by ho normálně nebylo. Dalším běžným použitím je vytvoření více pracovních oblastí, do kterých se dají přesunout nebo vyhodit položky. Pomocí této metody můžete vytvořit oblasti v jednom zobrazení, které mají různé významy. Uživatel pak může položky kategorizovat tak, že je umístí do jiné oblasti. Příkladem by bylo zobrazení systému souborů, který má oblast pro soubory jen pro čtení a zápis a další oblast pro soubory jen pro čtení. Pokud byla položka souboru přesunuta do oblasti jen pro čtení, automaticky by se stala jen pro čtení. Přesunutím souboru z oblasti jen pro čtení do oblasti pro čtení a zápis by se soubor mohl číst a zapisovat.
CListCtrl
poskytuje několik členských funkcí pro vytváření a správu pracovních oblastí v ovládacím prvku seznamu. GetWorkAreas a SetWorkAreas načítají a nastavují pole CRect
objektů (nebo RECT
struktur), které ukládají aktuálně implementované pracovní oblasti pro ovládací prvek seznamu. Kromě toho GetNumberOfWorkAreas načte aktuální počet pracovních oblastí pro ovládací prvek seznamu (ve výchozím nastavení nula).
Položky a pracovní oblasti
Při vytváření pracovní oblasti se položky, které leží v pracovní oblasti, stanou členy. Podobně pokud je položka přesunuta do pracovní oblasti, stane se členem pracovní oblasti, do které byla přesunuta. Pokud položka není v žádné pracovní oblasti, stane se automaticky členem první pracovní oblasti (index 0). Pokud chcete vytvořit položku a umístit ji do konkrétní pracovní oblasti, budete ji muset vytvořit a pak ji přesunout do požadované pracovní oblasti pomocí volání SetItemPosition. Druhý příklad níže ukazuje tuto techniku.
Následující příklad implementuje čtyři pracovní oblasti (rcWorkAreas
), se stejnou velikostí s ohraničením o šířce 10 pixelů kolem každé pracovní oblasti v ovládacím prvku seznamu (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);
Volání funkce ApproximateViewRect bylo provedeno za účelem získání odhadu celkové oblasti potřebné k zobrazení všech položek v jedné oblasti. Tento odhad se pak rozdělí do čtyř oblastí a vyčlení se 5 pixelovým ohraničením.
Další příklad přiřadí existující položky seznamu každé skupině (rcWorkAreas
) a aktualizuje zobrazení ovládacího prvku (m_WorkAreaListCtrl
) a dokončí efekt.
// 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);