Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Domyślnie kontrolka listy rozmieszcza wszystkie elementy w standardowy sposób siatki. Jednak obsługiwana jest inna metoda pracy z obszarami roboczymi, która rozmieszcza elementy listy w prostokątne grupy. Aby zapoznać się z obrazem kontrolki listy, która implementuje obszary robocze, zobacz Używanie kontrolek List-View w zestawie Windows SDK.
Uwaga / Notatka
Obszary robocze są widoczne tylko wtedy, gdy kontrolka listy jest w trybie ikony lub małej ikony. Jednak wszystkie bieżące obszary robocze są zachowywane, jeśli widok zostanie przełączony do trybu raportu lub listy.
Obszary robocze mogą być używane do wyświetlania pustego obramowania (po lewej, górnej i/lub po prawej stronie elementów) lub spowodować wyświetlenie poziomego paska przewijania, kiedy normalnie nie byłoby jednego. Innym typowym użyciem jest utworzenie wielu obszarów roboczych, do których można przenosić lub porzucać elementy. Za pomocą tej metody można utworzyć obszary w jednym widoku, które mają różne znaczenie. Użytkownik może następnie kategoryzować elementy, umieszczając je w innym obszarze. Przykładem może być widok systemu plików, który ma obszar dla plików odczytu/zapisu i inny obszar dla plików tylko do odczytu. Jeśli element pliku został przeniesiony do obszaru tylko do odczytu, automatycznie stanie się on tylko do odczytu. Przeniesienie pliku z obszaru tylko do odczytu do obszaru odczytu/zapisu spowoduje, że plik będzie odczytywany/zapisywany.
CListCtrl Udostępnia kilka funkcji członkowskich do tworzenia obszarów roboczych i zarządzania nimi w kontrolce listy.
GetWorkAreas i SetWorkAreas pobierają i ustawiają tablicę CRect obiektów (lub RECT struktur), które zawierają aktualnie wdrożone obszary robocze dla kontrolki listy. Ponadto polecenie GetNumberOfWorkAreas pobiera bieżącą liczbę obszarów roboczych dla kontrolki listy (domyślnie zero).
Elementy i obszary robocze
Po utworzeniu obszaru roboczego elementy znajdujące się w obszarze roboczym stają się jego członkami. Podobnie, jeśli element jest przenoszony do obszaru roboczego, staje się członkiem obszaru roboczego, do którego został przeniesiony. Jeśli element nie znajduje się w żadnym obszarze roboczym, automatycznie staje się członkiem pierwszego obszaru roboczego (indeks 0). Jeśli chcesz utworzyć element i umieścić go w określonym obszarze roboczym, musisz utworzyć element, a następnie przenieść go do żądanego obszaru roboczego z wywołaniem polecenia SetItemPosition. W drugim przykładzie poniżej przedstawiono tę technikę.
W poniższym przykładzie zaimplementowane są cztery obszary robocze (rcWorkAreas), o równym rozmiarze z obramowaniem o szerokości 10 pikseli wokół każdego obszaru roboczego w kontrolce listy (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);
Wywołanie elementu ApproximateViewRect zostało wykonane w celu uzyskania oszacowania całkowitego obszaru wymaganego do wyświetlenia wszystkich elementów w jednym regionie. To oszacowanie jest następnie podzielone na cztery regiony i wypełnione obramowaniem o szerokości 5 pikseli.
Kolejny przykład przypisuje istniejące elementy listy do każdej grupy (rcWorkAreas) i odświeża widok kontrolki (m_WorkAreaListCtrl), aby uzyskać pełny 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);