Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Informacje o kontrolkach List-View

Zobacz przykład kontrolki wirtualnego widoku listy.

Kontrolka widoku listy to okno, które wyświetla kolekcję elementów. Kontrolki widoku listy zapewniają kilka sposobów rozmieszczania i wyświetlania elementów i są znacznie bardziej elastyczne niż proste pola listy . Na przykład dodatkowe informacje o każdym elemencie mogą być wyświetlane w kolumnach po prawej stronie ikony i etykiety.

List-View Style i widoki

Kontrolki widoku listy mogą wyświetlać elementy w pięciu różnych widokach. Styl okna kontrolki określa widok domyślny. Dodatkowe style okien określają wyrównanie elementów i funkcje kontrolne. W tabeli poniżej opisano widoki.

Nazwa widoku Opis
Widok ikon Określony przez styl okna LVS_ICON lub przez przekazanie LV_VIEW_ICON razem z komunikatem LVM_SETVIEW. Każdy element jest wyświetlany jako ikona o pełnym rozmiarze z etykietą poniżej. Użytkownik może przeciągnąć elementy do dowolnej lokalizacji w oknie widoku listy.
Widok małej ikony Określone przez styl okna LVS_SMALLICON lub przez przekazanie LV_VIEW_SMALLICON przy użyciu LVM_SETVIEW. Każdy element jest wyświetlany jako mała ikona z etykietą po prawej stronie. Użytkownik może przeciągnąć elementy do dowolnej lokalizacji.
Widok listy Określony przez styl okna LVS_LIST lub przekazując LV_VIEW_LIST za pomocą LVM_SETVIEW. Każdy element jest wyświetlany jako mała ikona z etykietą po prawej stronie. Elementy są rozmieszczone w kolumnach, a użytkownik nie może przeciągnąć ich do dowolnej lokalizacji.
Widok raportu (szczegóły) Określone przez styl okna LVS_REPORT lub poprzez przekazanie LV_VIEW_DETAILS za pomocą LVM_SETVIEW. Każdy element jest wyświetlany we własnym wierszu z informacjami rozmieszczonymi w kolumnach. Kolumna po lewej stronie jest zawsze uzasadniona i zawiera małą ikonę i etykietę. Kolejne kolumny zawierają podwitryk określone przez aplikację. Każda kolumna ma nagłówek, chyba że określisz również styl okna LVS_NOCOLUMNHEADER.
Widok kafelkowy Wersja 6 lub nowsza. Określone przez przekazanie LV_VIEW_TILE za pomocą LVM_SETVIEW. Każdy element jest wyświetlany jako ikona o pełnym rozmiarze z etykietą składającą się z jednej lub więcej linii obok niego.

 

Poniższe zrzuty ekranu używają widoków, aby pokazać różne ilości informacji o każdym z siedmiu zwierząt domowych. Widoki pokazują, jak informacje mogą być wyświetlane w systemie Windows Vista. Style wizualizacji kontrolki zostały ustawione na motyw "Explorer" przy użyciu SetWindowTheme.

Poniższy zrzut ekranu przedstawia widok szczegółów.

zrzut ekranu przedstawiający informacje w pięciu kolumnach i siedmiu wierszach

Poniższy zrzut ekranu przedstawia widok ikony.

zrzut ekranu przedstawiający tylko nazwę każdego zwierzaka i ikonę wskazującą gatunku

Poniższy zrzut ekranu przedstawia widok listy.

zrzut ekranu, który pokazuje dużą ikonę obok nazwy, rasy i ceny każdego zwierzaka

Poniższy zrzut ekranu przedstawia widok kafelka.

widok kafelkowy.

Typ widoku można zmienić po utworzeniu kontrolki widoku listy. Aby pobrać i zmienić styl okna, użyj funkcji GetWindowLong i SetWindowLong. Aby określić style okna bieżącego widoku, użyj wartości LVS_TYPEMASK.

Możesz kontrolować sposób rozmieszczania elementów w ikonie lub w małym widoku ikon, określając styl okna LVS_ALIGNTOP (domyślny) lub LVS_ALIGNLEFT.

Możesz zmienić wyrównanie po utworzeniu kontrolki widoku listy. Aby określić bieżące wyrównanie, użyj wartości LVS_ALIGNMASK.

Dodatkowe style okien zapewniają inne opcje, takie jak możliwość edytowania etykiet przez użytkownika lub wybierania więcej niż jednego elementu jednocześnie. Aby uzyskać pełną listę, zobacz List-View Style okna.

Rozszerzone style List-View

Style rozszerzonego widoku listy kontrolek zapewniają opcje, takie jak pola wyboru, płaskie paski przewijania, linie siatki i interaktywne śledzenie. Aby uzyskać pełną listę, zobacz Extended List-View Styles. Nie uzyskujesz dostępu do rozszerzonych stylów widoku listy w taki sam sposób jak standardowe style okien. Nie używasz funkcji GetWindowLong i SetWindowLong, aby wprowadzić rozszerzone zmiany stylu.

Istnieją dwa komunikaty, które ustawiają i pobierają rozszerzone informacje o stylu, LVM_SETEXTENDEDLISTVIEWSTYLE i LVM_GETEXTENDEDLISTVIEWSTYLE. Zamiast jawnie wysyłać komunikaty, można użyć następujących odpowiednich makr: ListView_SetExtendedListViewStyle, ListView_SetExtendedListViewStyleExi ListView_GetExtendedListViewStyle.

Wirtualny styl List-View

Widok listy wirtualnej to kontrolka widoku listy, która ma styl LVS_OWNERDATA. Ten styl umożliwia kontrolce obsługę milionów elementów, ponieważ właściciel otrzymuje obciążenie związane z zarządzaniem danymi o elementach. Dzięki temu można użyć wirtualnej kontrolki widoku listy z dużymi bazami danych informacji, w których istnieją już określone metody dostępu do danych.

Wirtualna kontrolka widoku listy utrzymuje bardzo mało informacji o elemencie. Z wyjątkiem informacji o zaznaczeniu elementu i fokusie właściciel kontrolki musi zarządzać wszystkimi informacjami o elemencie. Inne procesy żądają informacji o elemencie od właściciela przy użyciu LVN_GETDISPINFO kodów powiadomień.

Ponieważ ten typ kontrolki listy jest przeznaczony dla dużych zestawów danych, zaleca się buforowanie żądanych danych elementu w celu zwiększenia wydajności pobierania. Wyświetlanie listy oferuje mechanizm wskazówek dotyczących pamięci podręcznej, który pomaga w optymalizacji pamięci podręcznej. Wskazówka jest implementowana w postaci kodu powiadomienia LVN_ODCACHEHINT.

Tworzenie kontrolki List-View wirtualnej

Wirtualne kontrolki widoku listy są tworzone przy użyciu CreateWindow lub funkcji CreateWindowEx, określając styl okna LVS_OWNERDATA w ramach parametru funkcji dwStyle. Dynamiczne przełączanie do i z stylu LVS_OWNERDATA nie jest obsługiwane.

Styl LVS_OWNERDATA można używać w połączeniu z większością innych stylów okien, z wyjątkiem stylu LVS_SORTASCENDING lub LVS_SORTDESCENDING. Wszystkie wirtualne kontrolki widoku listy są domyślne dla stylu LVS_AUTOARRANGE.

Aby umożliwić wyświetlanie elementów na liście, należy najpierw wysłać komunikat LVM_SETITEMCOUNT jawnie lub przy użyciu makra ListView_SetItemCountEx.

Następujące komunikaty nie są obsługiwane w stylu LVS_OWNERDATA: LVM_ENABLEGROUPVIEW, LVM_GETITEMTEXT, LVM_SETTILEINFOi LVM_MAPIDTOINDEX.

Problemy ze zgodnością

Wszystkie cztery style widoku listy — ikona, mała ikona, lista i widok raportu — obsługują styl LVS_OWNERDATA. Kontrolki widoku listy, które mają styl LVS_OWNERDATA, nie przechowują żadnych informacji specyficznych dla elementu. W związku z tym jedynymi prawidłowymi flagami stanu elementu, które można zastosować do elementu, są LVIS_SELECTED i LVIS_FOCUSED. Nie są przechowywane żadne inne informacje o stanie. W szczególności kontrolka widoku listy nie obsługuje stanu ani obrazów nakładek dla każdego elementu. Możesz jednak sprawić, by kontrolka widoku listy zapytała twoją aplikację o te obrazy, wysyłając jej komunikat LVM_SETCALLBACKMASK.

Większość komunikatów sterujących widoku listy i skojarzonych makr jest w pełni obsługiwana. Jednak niektóre komunikaty mają ograniczenia lub nie są obsługiwane podczas korzystania ze stylu LVS_OWNERDATA. Poniższa tabela zawiera podsumowanie komunikatów, których dotyczy problem.

Komunikat Ograniczenie
LVM_ARRANGE Nie obsługuje stylu LVA_SNAPTOGRID.
LVM_DELETEALLITEMS Ustawia liczbę elementów na zero i czyści wszystkie wewnętrzne zmienne wyboru, ale w rzeczywistości nie usuwa żadnych elementów. Powoduje to wywołanie zwrotne powiadomień.
LVM_DELETEITEM Jest wspierany tylko w przypadku integralności zaznaczenia i rzeczywiście nie usuwa elementu.
LVM_GETITEMSTATE Zwraca tylko stany fokusu i zaznaczenia (czyli te stany przechowywane przez kontrolkę widoku listy).
LVM_GETNEXTITEM Nie obsługuje kryteriów wyszukiwania w widoku listy LVNI_CUT, LVNI_HIDDENlub LVNI_DROPHILITED. Obsługiwane są wszystkie inne kryteria.
LVM_GETWORKAREAS Nie jest obsługiwane.
LVM_INSERTITEM Jest obsługiwana tylko w przypadku integralności wyboru.
LVM_SETITEM Nie jest obsługiwane. Aby ustawić stan elementu, użyj komunikatu ListView_SetItemState.
LVM_SETITEMCOUNT Ustawia liczbę elementów aktualnie znajdujących się na liście. Jeśli kontrolka widoku listy wysyła powiadomienie, które żąda danych dla dowolnego elementu do maksymalnego zestawu, właściciel musi być przygotowany do dostarczenia tych danych. Parametry komunikatu obsługują wirtualne kontrolki widoku listy.
LVM_SETITEMPOSITION Nie jest obsługiwane.
LVM_SETITEMSTATE Umożliwia zmianę tylko stanów zaznaczenia i fokusu dla elementu.
LVM_SETITEMTEXT Nie jest obsługiwane. Obowiązkiem aplikacji jest utrzymanie tekstów elementów.
LVM_SETWORKAREAS Nie jest obsługiwane.
LVM_SORTITEMS Nie jest obsługiwane. Obowiązkiem aplikacji jest przedstawienie elementów w żądanej kolejności.

 

Obsługa wirtualnych kodów powiadomień sterowania List-View

Kontrolki widoku listy z stylem LVS_OWNERDATA wysyłają te same kody powiadomień, co inne kontrolki widoku listy, oraz dwa dodatkowe: LVN_ODCACHEHINT i LVN_ODFINDITEM. Poniżej przedstawiono najbardziej typowe powiadomienia wysyłane przez kontrolkę widoku listy z LVS_OWNERDATA stylem.

Powiadomienie Opis
LVN_GETDISPINFO Wirtualna kontrolka widoku listy zachowuje bardzo mało informacji o elemencie. W związku z tym często wysyła kod powiadomienia LVN_GETDISPINFO w celu żądania informacji o elemencie. Ten komunikat jest obsługiwany w taki sam sposób, jak elementy wywołania zwrotnego w standardowej kontrolce listy. Ponieważ liczba elementów obsługiwanych przez kontrolkę może być bardzo duża, buforowanie danych elementów zwiększa wydajność. Podczas obsługi LVN_GETDISPINFO właściciel kontrolki najpierw próbuje podać żądane informacje o elemencie z pamięci podręcznej (aby uzyskać więcej informacji, zobacz Cache Management). Jeśli żądany element nie jest buforowany, właściciel musi być przygotowany do dostarczenia informacji w inny sposób.
LVN_ODCACHEHINT Widok listy wirtualnej wysyła kod powiadomienia LVN_ODCACHEHINT, aby pomóc w optymalizacji pamięci podręcznej. Kod powiadomienia zawiera wartości indeksowe obejmujące zakres elementów, które zaleca buforować. Po otrzymaniu kodu powiadomienia właściciel musi być przygotowany do załadowania pamięci podręcznej informacjami o elementach dla żądanego zakresu, aby informacje były łatwo dostępne po wysłaniu komunikatu LVN_GETDISPINFO.
LVN_ODFINDITEM Kod powiadomienia LVN_ODFINDITEM jest wysyłany przez wirtualną kontrolkę widoku listy, gdy kontrolka wymaga od właściciela znalezienia określonego elementu wywołania zwrotnego. Kod powiadomienia jest wysyłany, gdy kontrolka widoku listy odbiera szybki dostęp klawiszy lub gdy odbiera komunikat LVM_FINDITEM. Informacje wyszukiwania są wysyłane w postaci struktury LVFINDINFO, która jest członkiem struktury NMLVFINDITEM. Właściciel musi być przygotowany do wyszukiwania elementu zgodnego z informacjami podanymi przez kontrolkę widoku listy. Właściciel zwraca indeks elementu, jeśli się powiedzie, lub -1, jeśli nie zostanie znaleziony pasujący element.

 

Zarządzanie pamięcią podręczną

Kontrolka widoku listy z stylem LVS_OWNERDATA generuje dużą liczbę kodów powiadomień LVN_GETDISPINFO i, aby pomóc w optymalizacji pamięci podręcznej, komunikat LVN_ODCACHEHINT. LVN_ODCACHEHINT komunikaty zawierają informacje o zalecanych elementach do uwzględnienia w pamięci podręcznej. Te komunikaty są wysyłane jako komunikaty WM_NOTIFY z wartością lParam działającą jako adres struktury NMLVCACHEHINT.

Struktura NMLVCACHEHINT zawiera dwa elementy całkowite, iFrom i iTo, które reprezentują włączne punkty końcowe zakresu elementów, które najprawdopodobniej będą potrzebne. Właściciel musi być przygotowany do załadowania pamięci podręcznej informacjami o każdym z elementów znajdujących się w zalecanym zakresie.

Kontrolka listy często potrzebuje informacji o pierwszym elemencie (przesunięcie 0). Kod powiadomienia LVN_ODCACHEHINT może nie zawsze zawierać element 0, ale zawsze musi być uwzględniony w pamięci podręcznej.

Dostęp do ostatnich elementów na liście jest często uzyskiwany. W związku z tym właściciel może chcieć zachować drugą pamięć podręczną zawierającą elementy na końcu listy. Żądany zakres od LVN_ODCACHEHINT można sprawdzić w końcowej pamięci podręcznej, aby udostępnić go automatycznie, zamiast za każdym razem ponownie ładować ten sam końcowy zakres.

obszary robocze List-View

Kontrolki widoku listy obsługują obszary robocze, które są prostokątnymi obszarami wirtualnymi używanymi przez kontrolkę widoku listy do rozmieszczania elementów. Obszar roboczy nie jest oknem i nie może mieć widocznego obramowania. Domyślnie kontrolka widoku listy nie ma obszarów roboczych. Tworząc obszar roboczy, można utworzyć puste obramowanie po lewej, górnej lub prawej stronie elementów lub spowodować wyświetlenie poziomego paska przewijania w sytuacjach, w których normalnie by się nie pojawiał.

Po utworzeniu obszaru roboczego elementy znajdujące się w obszarze roboczym stają się członkami obszaru roboczego. Podobnie, jeśli element zostanie przeniesiony do obszaru roboczego, element stanie się członkiem tego obszaru roboczego. Jeśli element nie znajduje się w żadnym obszarze roboczym, automatycznie staje się członkiem pierwszego obszaru roboczego (indeks 0). Aby umieścić nowy element w określonym obszarze roboczym, należy najpierw utworzyć element, a następnie użyć LVM_SETITEMPOSITION lub komunikatu LVM_SETITEMPOSITION32, aby przenieść go do żądanego obszaru roboczego.

Poniższa ilustracja to przykład kontrolki widoku listy, która zawiera cztery obszary robocze, z których każda znajduje się w innej ćwiartce obszaru klienta.

zrzut ekranu kontrolki typu widok listy z jednym obszarem roboczym w każdej ćwiartce obszaru użytkownika

W jednym widoku można użyć wielu obszarów roboczych do tworzenia różnych sekcji. Obszary można tworzyć w jednym widoku, które mają różne znaczenie. Na przykład widok systemu plików może mieć obszar dla plików do odczytu/zapisu i inny obszar dla plików tylko do odczytu. Użytkownik może kategoryzować elementy, umieszczając je w różnych obszarach roboczych. Jeśli plik zostanie przeniesiony do obszaru tylko do odczytu, automatycznie stanie się tylko do odczytu.

Wiele obszarów roboczych może przecinać się, ale wszystkie elementy znajdujące się w obrębie skrzyżowania stają się członkami obszaru o niższym indeksie; dlatego najlepiej jest uniknąć tej sytuacji. Podczas sortowania wielu obszarów roboczych elementy są sortowane w porównaniu z innymi elementami w tym samym obszarze roboczym.

Liczbę obszarów roboczych można pobrać za pomocą komunikatu LVM_GETNUMBEROFWORKAREAS. Obszary robocze są zmieniane przy użyciu komunikatu LVM_SETWORKAREAS i można je pobrać za pomocą komunikatu LVM_GETWORKAREAS. Oba te komunikaty przyjmują jako lParam adres tablicy struktur RECT oraz jako wParamliczbę struktur RECT. Lewe i górne składowe tych struktur określają współrzędne lewego górnego rogu (początek) obszaru roboczego, a prawą prawą i dolnego elementów członkowskich określają prawy dolny róg obszaru roboczego. Wszystkie współrzędne znajdują się we współrzędnych klienta widoku listy. Maksymalna dozwolona liczba dozwolonych obszarów roboczych jest definiowana przez wartość LV_MAX_WORKAREAS.

Zmiana obszaru roboczego nie ma wpływu na kontrolki widoku listy, które mają widok LVS_LIST lub LVS_REPORT, ale obszary robocze zostaną zachowane po zmianie typu widoku. Dzięki widokom LVS_ICON i LVS_SMALLICON można zmodyfikować obszar roboczy, aby zmienić sposób wyświetlania elementów. Ustawienie szerokości obszaru roboczego większej niż szerokość kontrolki powoduje, że elementy zostaną zawinięte do tej szerokości, a poziomy pasek przewijania zostanie wyświetlony. Jeśli szerokość obszaru roboczego jest mniejsza niż szerokość obszaru klienta kontrolki, powoduje to, że elementy są zawijane w obszarze roboczym, a nie w obszarze klienta. Ustawienie wartości dodatniej dla członka o wartości lewo lub o wartości góra powoduje, że elementy są wyświetlane począwszy od obszaru roboczego, tworząc pustą przestrzeń między brzegiem kontrolki a elementami. Puste miejsce można również utworzyć między prawą krawędzią kontrolki a elementami, dzięki czemu szerokość obszaru roboczego jest mniejsza niż szerokość klienta kontrolki.

Listy Obrazów List-View

Domyślnie kontrolka widoku listy nie wyświetla obrazów elementów. Aby wyświetlić obrazy elementów, należy utworzyć listy obrazów i skojarzyć je z kontrolką. Kontrolka widoku listy może zawierać trzy listy obrazów:

  • Lista obrazów zawierająca ikony o pełnym rozmiarze wyświetlane, gdy kontrolka znajduje się w widoku ikon.
  • Lista obrazów zawierająca małe ikony wyświetlane, gdy kontrolka znajduje się w małym widoku ikony, widoku listy lub widoku raportu.
  • Lista obrazów zawierająca obrazy stanu, które są wyświetlane po lewej stronie pełnej lub małej ikony. Możesz użyć obrazów stanu, takich jak zaznaczone i wyczyszczone pola wyboru, aby wskazać stany elementów zdefiniowanych przez aplikację. Obrazy stanu są wyświetlane w widoku ikon, małym widoku ikon, widoku listy i widoku raportu.

Listy obrazów ikon o pełnym rozmiarze i małym rozmiarze mogą również zawierać obrazy nakładki, które mają być rysowane w sposób niewidoczny dla ikon elementów.

Aby użyć obrazów nakładek w kontrolce widoku listy:

  1. Wywołaj funkcję ImageList_SetOverlayImage, aby przypisać indeks nakładki obrazu do obrazu na listach obrazów pełnoekranowych i małych ikon. Obraz nakładki jest identyfikowany przez jeden indeks.
  2. Indeks obrazu nakładkowego można przypisać do elementu podczas wywoływania makra ListView_InsertItem lub ListView_SetItem. Użyj makraINDEXTOOVERLAYMASK, aby określić indeks obrazu nakładki w stanie elementu struktury LVITEM. Należy również ustawić bity LVIS_OVERLAYMASK w elemencie stateMask elementu członkowskiego.

Jeśli zostanie określona lista obrazów stanu, kontrolka widoku listy rezerwuje miejsce po lewej stronie ikony każdego elementu dla obrazu stanu.

Aby skojarzyć obraz stanu z elementem, użyj makra INDEXTOSTATEIMAGEMASK, aby określić indeks obrazu stanu w stanie elementu członkowskiego struktury LVITEM. Indeks identyfikuje obraz na liście obrazów stanu kontrolki. Mimo że indeksy listy obrazów są oparte na zera, kontrolka używa indeksów opartych na jednym do identyfikowania obrazów stanu. Indeks obrazu stanu o wartości zero wskazuje, że element nie ma obrazu stanu.

Domyślnie, gdy kontrolka widoku listy zostanie zniszczona, niszczy przypisane do niej listy obrazów. Jeśli jednak kontrolka widoku listy ma styl okna LVS_SHAREIMAGELISTS, aplikacja jest odpowiedzialna za niszczenie list obrazów, gdy nie są już używane. Należy określić ten styl, jeśli przypiszesz te same listy obrazów do wielu kontrolek widoku listy; w przeciwnym razie więcej niż jedna kontrolka może próbować zniszczyć tę samą listę obrazów.

List-View Elementy i podpozycje

Każdy element w kontrolce widoku listy ma ikonę, etykietę, bieżący stan i wartość zdefiniowaną przez aplikację. Za pomocą komunikatów widoku listy można dodawać, modyfikować i usuwać elementy, a także pobierać informacje o elementach.

Każdy element może mieć jeden lub więcej elementów podrzędnych . Subitem to ciąg, który w widoku raportu jest wyświetlany w kolumnie oddzielonej od ikony i etykiety elementu. Aby określić tekst subitem, użyj komunikatu LVM_SETITEMTEXT lub LVM_SETITEM. Wszystkie elementy w kontrolce widoku listy mają taką samą liczbę elementów podrzędnych. Liczba podpozycji jest określana przez liczbę kolumn w kontrolce widoku listy. Po dodaniu kolumny do kontrolki widoku listy należy określić skojarzony z nim indeks subitem.

Struktura LVITEM definiuje element lub subitem widoku listy. Element członkowski iItem jest indeksem zerowym elementu. Element członkowski iSubItem jest jednym indeksem subitem lub zero, jeśli struktura zawiera informacje o elemencie. Dodatkowe atrybuty określają tekst elementu, ikonę, stan i dane elementu. dane elementu to wartość zdefiniowana przez aplikację skojarzona z elementem widoku listy.

Aby dodać element do kontrolki widoku listy, użyj komunikatu LVM_INSERTITEM, określając adres struktury LVITEM. Przed dodaniem wielu elementów możesz wysłać komunikat LVM_SETITEMCOUNT do kontroli, określając liczbę elementów, które kontrola ostatecznie będzie zawierać. Ten komunikat umożliwia kontrolce widoku listy ponowne przydzielanie jej wewnętrznych struktur danych tylko raz, a nie za każdym razem, gdy dodajesz element. Liczbę elementów w kontrolce widoku listy można określić przy użyciu komunikatu LVM_GETITEMCOUNT. Jeśli dodasz dużą liczbę elementów do kontrolki widoku listy, możesz przyspieszyć proces, wyłączając ponowne rysowanie przed dodaniem elementów, a następnie włącz ponowne rysowanie po dodaniu elementów. Użyj komunikatu WM_SETREDRAW, aby włączyć i wyłączyć ponowne rysowanie.

Aby zmienić atrybuty elementu widoku listy, użyj komunikatu LVM_SETITEM, określając adres struktury LVITEM. Maska składowa tej struktury określa atrybuty elementu, które chcesz zmienić. Aby na przykład zmienić tylko tekst elementu lub subitem, użyj komunikatu LVM_SETITEMTEXT.

Aby pobrać informacje o elemencie widoku listy, użyj komunikatu LVM_GETITEM, określając adres struktury LVITEM do wypełnienia. Maska składowa tej struktury określa atrybuty elementu do pobrania. Aby pobrać tylko tekst elementu lub elementu podrzędnego, użyj komunikatu LVM_GETITEMTEXT.

Aby usunąć element widoku listy, użyj komunikatu LVM_DELETEITEM. Wszystkie elementy w kontrolce widoku listy można usunąć przy użyciu komunikatu LVM_DELETEALLITEMS.

Stany Elementów List-View

Stan elementu to wartość określająca dostępność elementu, wskazuje akcje użytkownika lub w inny sposób odzwierciedla stan elementu. Kontrolka widoku listy zmienia niektóre bity stanu, na przykład gdy użytkownik wybierze element. Aplikacja może zmienić inne bity stanu, aby wyłączyć lub ukryć element albo określić obraz nakładki lub obraz stanu. Aby uzyskać więcej informacji na temat obrazów nakładek i obrazów stanu, zobacz List-View Listy obrazów.

Stan elementu jest określony przez członka stanu struktury LVITEM. Po określeniu lub zmianie stanu elementu stateMask element członkowski określa, które bity stanu należy zmienić. Stan elementu można zmienić przy użyciu komunikatu LVM_SETITEMSTATE. Stan elementu można określić podczas jego tworzenia lub zmiany jego atrybutów przy użyciu komunikatu LVM_SETITEM. Aby określić bieżący stan elementu, użyj komunikatu LVM_GETITEMSTATE lub LVM_GETITEM.

Aby ustawić obraz nakładki elementu, element stateMask elementu członkowskiego LVITEM musi zawierać wartość LVIS_OVERLAYMASK, a element członkowski stanu musi zawierać jeden indeks obrazu nakładki przesunięty w lewo 8 bitów przy użyciu makra INDEXTOOVERLAYMASK. Indeks może mieć wartość zero, aby oznaczać brak obrazu nakładki.

Aby ustawić obraz stanu elementu, członek stateMask struktury LVITEM musi zawierać wartość LVIS_STATEIMAGEMASK. Członek state powinien zawierać indeks obrazu stanu, rozpoczynający się od jedynki, przesunięty w lewo o 12 bitów przy użyciu makra INDEXTOSTATEIMAGEMASK. Indeks może mieć wartość zero, aby nie określić obrazu stanu.

Elementy wywołania zwrotnego i maska wywołania zwrotnego

Dla każdego z elementów kontrolka widoku listy zwykle przechowuje tekst etykiety, indeks listy obrazów ikon elementu oraz zestaw flag bitowych dla stanu elementu. Możesz zdefiniować elementy wywołania zwrotnego lub zmienić maskę wywołania zwrotnego kontrolki, aby wskazać, że aplikacja, a nie kontrolka, przechowuje niektóre lub wszystkie te informacje. Jeśli aplikacja przechowuje niektóre z tych informacji, warto użyć wywołań zwrotnych.

Element w kontrolce widoku listy to element wywołania zwrotnego, dla którego aplikacja przechowuje indeks tekstu, indeks ikony lub oba jednocześnie. Elementy wywołania zwrotnego można zdefiniować podczas wysyłania komunikatu LVM_INSERTITEM, aby dodać element do kontrolki widoku listy. Jeśli aplikacja przechowuje tekst elementu lub podpozycji, ustaw członka pszText w strukturze LVITEM na LPSTR_TEXTCALLBACK. Jeśli aplikacja przechowuje indeks ikon dla elementu, ustaw składową iImage w strukturze LVITEM elementu na I_IMAGECALLBACK.

Maska wywołania zwrotnego kontrolki widoku listy jest zestawem flag bitowych określających stany elementów, dla których aplikacja, a nie kontrolka, przechowuje bieżące dane. Maska wywołania zwrotnego ma zastosowanie do wszystkich elementów kontrolki, w przeciwieństwie do oznaczenia elementu wywołania zwrotnego, które ma zastosowanie do określonego elementu. Maska wywołania zwrotnego domyślnie wynosi zero, co oznacza, że kontrolka widoku listy przechowuje wszystkie informacje o stanie elementu. Po utworzeniu kontrolki widoku listy i zainicjowaniu jej elementów możesz wysłać komunikat LVM_SETCALLBACKMASK, aby zmienić maskę wywołania zwrotnego. Aby pobrać bieżącą maskę wywołania zwrotnego, wyślij komunikat LVM_GETCALLBACKMASK.

Gdy kontrolka widoku listy musi wyświetlić lub posortować element, dla którego aplikacja przechowuje informacje o wywołaniu zwrotnym, kontrolka wysyła kod powiadomienia LVN_GETDISPINFO do swojego okna nadrzędnego. Ten komunikat określa NMLVDISPINFO strukturę, która zawiera typ wymaganych informacji i identyfikuje element lub podpozycję do pobrania. Okno nadrzędne musi przetwarzać LVN_GETDISPINFO w celu dostarczenia żądanych danych.

Jeśli kontrolka widoku listy wykryje zmianę informacji zwrotnych elementu, takich jak zmiana tekstu, ikony lub informacji o stanie, kontrolka wysyła kod powiadomienia LVN_SETDISPINFO w celu powiadomienia o zmianie.

Jeśli zmienisz atrybuty lub bity stanu elementu wywołania zwrotnego, użyj komunikatu LVM_UPDATE, aby wymusić przemalowanie elementu za pomocą kontrolki. Ten komunikat powoduje również, że kontrolka rozmieści elementy, jeśli ma styl LVS_AUTOARRANGE. Możesz użyć komunikatu LVM_REDRAWITEMS, aby ponownie wyrysować zakres elementów, unieważniając odpowiednie części obszaru klienta kontrolki widoku listy.

Efektywnie używając elementów wywołania zwrotnego i maski wywołania zwrotnego, można upewnić się, że każdy atrybut elementu jest utrzymywany tylko w jednym miejscu. Może to uprościć aplikację, ale jedynym zapisanym miejscem jest pamięć, która w przeciwnym razie będzie wymagana do przechowywania etykiet elementów i tekstu podrzędnego.

Pozycja elementu List-View

Każdy element widoku listy ma położenie i rozmiar, który można pobrać i ustawić przy użyciu komunikatów. Możesz również określić, który element, jeśli istnieje, znajduje się na określonej pozycji. Pozycja elementów w widoku listy jest określona w współrzędnych widoku , które są współrzędnymi klienta, przesuniętymi o położenie przewijania.

Aby pobrać i ustawić pozycję elementu, użyj komunikatów LVM_GETITEMPOSITION i LVM_SETITEMPOSITION. LVM_GETITEMPOSITION działa dla wszystkich widoków, ale LVM_SETITEMPOSITION działa tylko w przypadku widoków ikon i małych ikon.

Możesz określić, który element, jeśli istnieje, znajduje się w określonej lokalizacji, używając komunikatu LVM_HITTEST.

Aby pobrać prostokąt ograniczający dla elementu listy lub tylko dla jego ikony lub etykiety, użyj komunikatu LVM_GETITEMRECT.

Rozmieszczanie, sortowanie i znajdowanie elementów

Za pomocą komunikatów widoku listy można rozmieszczać i sortować elementy oraz znajdować elementy na podstawie ich atrybutów lub pozycji. Rozmieszczenie elementów wyrównuje je do siatki, ale indeksy elementów pozostają bez zmian. Sortowanie zmienia sekwencję elementów (i odpowiadających im indeksów), a następnie je odpowiednio przemieszcza. Elementy można rozmieścić tylko w widokach ikon i małych ikon, ale można sortować elementy w dowolnym widoku. Aby znaleźć elementy, wysyłasz komunikaty widoku listy, które określają lokalizację lub właściwość elementu.

Aby rozmieścić elementy, użyj komunikatu LVM_ARRANGE. Możesz mieć pewność, że elementy są rozmieszczane przez cały czas, określając styl okna LVS_AUTOARRANGE.

Aby posortować elementy, użyj komunikatu LVM_SORTITEMS. Podczas sortowania przy użyciu tej funkcji wiadomości należy określić funkcję wywołania zwrotnego zdefiniowaną przez aplikację, którą sterowanie widoku listy wywołuje do porównania względnej kolejności dowolnych dwóch elementów. Kontrolka przekazuje do funkcji porównania dane elementu skojarzone z każdym z dwóch elementów. Dane elementu to wartość określona w lParam składowej LVITEM elementu, gdy została wstawiona do listy. Określając odpowiednie dane elementu i podając odpowiednią funkcję porównania, można sortować elementy według ich etykiety, dowolnego subitem lub dowolnej innej właściwości. Należy pamiętać, że sortowanie elementów nie zmienia kolejności odpowiadających im elementów podrzędnych. Gdy elementy są zmieniane, ich odpowiadające im elementy podrzędne są przenoszone z nimi; oznacza to, że całe wiersze są przechowywane razem. Aby uporządkować kolumny oddzielnie od siebie, odłączając elementy podrzędne od ich elementów, należy ponownie wygenerować kolumny po sortowaniu przy użyciu LVM_SETITEM.

Możesz upewnić się, że kontrolka widoku listy jest zawsze sortowana, określając styl okna LVS_SORTASCENDING lub LVS_SORTDESCENDING. Kontrolki z tymi stylami używają tekstu etykiety elementów do sortowania ich w kolejności rosnącej lub malejącej. Podczas korzystania z tych stylów okna nie można podać funkcji porównania. Jeśli kontrolka widoku listy ma jeden z tych stylów, komunikat LVM_INSERTITEM zakończy się niepowodzeniem, jeśli spróbujesz wstawić element, który ma LPSTR_TEXTCALLBACK jako element członkowski pszText jego struktury LVITEM.

Element widoku listy z określonymi właściwościami można znaleźć przy użyciu komunikatu LVM_FINDITEM. Możesz znaleźć element widoku listy, który znajduje się w określonym stanie i ma określoną relację z danym elementem, używając komunikatu LVM_GETNEXTITEM. Możesz na przykład pobrać następny wybrany element z prawej strony określonego elementu.

Kolumny List-View

Kolumny kontrolują sposób wyświetlania elementów i ich podrzędnych w widoku raportu. Każda kolumna ma tytuł i szerokość i jest skojarzona z określoną podpozycją; podpozycja zero to ikona i etykieta elementu. Atrybuty kolumny są definiowane przez strukturę LVCOLUMN.

Aby dodać kolumnę do kontrolki widoku listy, użyj komunikatu LVM_INSERTCOLUMN. Aby usunąć kolumnę, użyj komunikatu LVM_DELETECOLUMN.

Uwaga

Usuwanie kolumny zero kontrolki list-view jest obsługiwane tylko w wersji ComCtl32.dll 6 lub nowszej. Wersja 5 obsługuje również usuwanie kolumny zero, ale dopiero po ustawieniu wersji na 5 lub nowszą za pomocą CCM_SETVERSION. Wersje wcześniejsze niż wersja 5 nie obsługują usuwania zera kolumn.

 

Właściwości istniejącej kolumny można pobrać i zmienić przy użyciu komunikatów LVM_GETCOLUMN i LVM_SETCOLUMN. Aby pobrać lub zmienić szerokość kolumny, użyj komunikatów LVM_GETCOLUMNWIDTH i LVM_SETCOLUMNWIDTH.

O ile nie określono stylu okna LVS_NOCOLUMNHEADER, nagłówki kolumn są wyświetlane w widoku raportu. Użytkownik może kliknąć nagłówek kolumny, powodując wysłanie kodu powiadomienia LVN_COLUMNCLICK do okna nadrzędnego. Zazwyczaj okno nadrzędne sortuje kontrolkę widoku listy według określonej kolumny po kliknięciu. Użytkownik może również przeciągnąć prowadnice kolumn między nagłówkami, aby ustawić rozmiar kolumn.

Kontrolki widoku listy mogą wyświetlać obrazy obok tytułów kolumn. Aby zaimplementować tę funkcję, określ wartość LVCF_IMAGE i przypisz indeks obrazu do elementu członkowskiego iImage w strukturze LVCOLUMN.

Kontrolki widoku listy mogą ustawiać kolejność wyświetlania kolumn. Aby zaimplementować tę funkcję, określ wartość LVCF_ORDER i przypisz kolejność kolumn do członka iOrder w strukturze LVCOLUMN. Kolejność kolumn jest oparta na wartości zero i jest w kolejności od lewej do prawej. Na przykład zero wskazuje kolumnę po lewej stronie.

List-View położenie przewijania

Jeśli nie określono stylu okna LVS_NOSCROLL, można przewijać kontrolkę widoku listy, aby wyświetlić więcej elementów niż można zmieścić w obszarze klienta kontrolki. Możesz uzyskać pozycję przewijania kontrolki widoku listy oraz powiązane informacje, przewijać kontrolkę widoku listy o określoną wartość lub przewijać kontrolkę widoku listy, aby określony element listy był widoczny.

W widoku ikon lub widoku małych ikon bieżące położenie przewijania jest określane przez punkt początkowy widoku . Źródło widoku jest zestawem współrzędnych względem widocznego obszaru kontrolki widoku listy, które odpowiadają współrzędnym widoku (0, 0). Aby pobrać bieżące źródło widoku, użyj komunikatu LVM_GETORIGIN. Ten komunikat powinien być używany tylko w widoku ikony lub małej ikony; zwraca błąd w widoku listy lub raportu.

W widoku listy lub raportu bieżąca pozycja przewijania jest definiowana przez najwyższy indeks . Górny indeks to indeks pierwszego widocznego elementu w kontrolce widoku listy. Aby pobrać bieżący indeks najwyższego poziomu, użyj komunikatu LVM_GETTOPINDEX. Ten komunikat zwraca prawidłowy wynik tylko w widoku listy lub raportu; zwraca zero w widoku ikony lub małej ikony.

Możesz użyć komunikatu LVM_GETVIEWRECT, aby pobrać prostokąt ograniczenia wszystkich elementów w kontrolce widoku listy względem widocznego obszaru kontrolki.

Komunikat LVM_GETCOUNTPERPAGE zwraca liczbę elementów pasujących do jednej strony kontrolki widoku listy. Ten komunikat zwraca prawidłowy wynik tylko w widokach listy i raportu; w widokach ikon i małych ikon zwraca łączną liczbę elementów.

Aby przewinąć listę w kontrolce widoku o konkretną ilość, użyj komunikatu LVM_SCROLL. Korzystając z komunikatu LVM_ENSUREVISIBLE, możesz w razie potrzeby przewinąć kontrolkę widoku listy, aby upewnić się, że określony element jest widoczny.

Edytowanie etykiet List-View

Kontrolka widoku listy, która ma styl okna LVS_EDITLABELS, umożliwia użytkownikowi edytowanie etykiet elementów. Użytkownik rozpoczyna edycję, klikając etykietę elementu, który ma fokus. Alternatywnie aplikacja może rozpocząć edytowanie automatycznie przy użyciu komunikatu LVM_EDITLABEL. Kontrolka widoku listy powiadamia okno nadrzędne po rozpoczęciu edycji i po anulowaniu lub zakończeniu. Po zakończeniu edycji okno nadrzędne jest odpowiedzialne za aktualizowanie etykiety elementu, jeśli jest to konieczne.

Kiedy rozpoczyna się edycja etykiety, tworzona, umieszczona i zainicjowana zostaje kontrolka edycji . Kontrolka widoku listy, zanim zostanie wyświetlona, wysyła w okno nadrzędne kod powiadomienia LVN_BEGINLABELEDIT. Jeśli musisz zmodyfikować proces edytowania etykiet, możesz zaimplementować procedurę obsługi dla tego powiadomienia.

Jednym z zastosowań programu obsługi powiadomień LVN_BEGINLABELEDIT jest kontrolowanie etykiet, które użytkownik może edytować. Aby zapobiec edycji etykiet, zwróć wartość niezerową. Aby dostosować edytowanie etykiet, obsługujący powiadomienia powinien pobrać uchwyt do kontrolki edycji, wysyłając komunikat LVM_GETEDITCONTROL do kontrolki widoku listy. Po utworzeniu tego uchwytu możesz dostosować element sterujący edycją za pomocą wysyłania zwykłych komunikatów EM_XXX. Aby na przykład ograniczyć ilość tekstu, którą użytkownik może wprowadzić, wyślij kontrolkę edycji komunikat EM_LIMITTEXT. Domyślny tekst kontrolki edycji można zmienić przy użyciu SetWindowText. Możesz nawet rozszerzyć kontrolkę edycji, aby przechwytywać i odrzucać nieprawidłowe znaki.

Po anulowaniu lub zakończeniu edytowania etykiety, kontrolka listy wysyła do okna nadrzędnego kod powiadomienia LVN_ENDLABELEDIT. Parametr lParam jest adresem strukturyNMLVDISPINFO. Element elementu tej struktury jest strukturą LVITEM, której człon iItem identyfikuje element. Jeśli edytowanie zostanie anulowane, pszText element członkowski struktury LVITEM jest NULL; w przeciwnym razie pszText jest adresem edytowanego tekstu. Okno nadrzędne jest odpowiedzialne za aktualizowanie etykiety elementu, jeśli chce zachować nową etykietę.

kolory List-View

Aplikacja może pobrać i ustawić trzy kolory dla kontrolki widoku listy.

Kolor Komunikaty używane do pobierania i ustawiania kolorów
Kolor tekstu LVM_GETTEXTCOLOR, LVM_SETTEXTCOLOR
Kolor tła tekstu LVM_GETTEXTBKCOLOR, LVM_SETTEXTBKCOLOR
Kolor tła okna LVM_GETBKCOLOR, LVM_SETBKCOLOR

 

Aby znacznie dostosować wygląd kontrolki widoku listy, użyj NM_CUSTOMDRAW (widoku listy) lub użyj stylów wizualizacji (zobacz Style wizualne i Włączanie stylów wizualizacji).

Rozmieszczanie elementów listy według grupy

Funkcje grupowania kontrolki widoku listy umożliwiają wizualne grupowanie logicznie powiązanych zestawów elementów. Grupy można tworzyć na podstawie właściwości, atrybutów lub innych cech elementu. Te grupy są zwykle oddzielone na ekranie przez nagłówek poziomy zawierający nazwę grupy. Poniższy zrzut ekranu przedstawia zgrupowane elementy.

zrzut ekranu kontrolki widoku listy, z psami w jednej grupie i kotami w innej grupie

Struktura LVGROUP służy do przechowywania informacji o grupie, takich jak tekst nagłówka i stopki, bieżący stan grupy itd. Interfejs API grupowania zawiera komunikaty, które umożliwiają zarządzanie grupami i elementami grupy przez dodawanie elementów do grup, dodawanie grup do widoków, sortowanie elementów grupy i wykonywanie zapytań dotyczących grup pod kątem rozmiaru elementu i innych informacji. Można na przykład ustawić i pobrać parametry wyświetlania dla każdej grupy przy użyciu makr ListView_SetGroupMetrics i ListView_GetGroupMetrics.

Grupowanie jest dostępne we wszystkich widokach z wyjątkiem widoku listy. Nie jest ona dostępna w kontrolkach, które mają styl LVS_OWNERDATA.

Aby uzyskać więcej informacji, zobacz Using List-View Controls.

Znaczniki wstawiania

Znaczniki wstawiania pokazują użytkownikom, gdzie zostaną umieszczone przeciągane elementy. Znaczniki wstawiania są obecnie wyświetlane, gdy użytkownik przeciąga element do menu Start lub paska Szybkiego uruchamiania. Znacznik wstawiania działa również w przypadku list, które są ustawione na autoarrange. Gdy użytkownik przeciąga element do punktu między dwoma innymi elementami, znacznik wstawiania pokazuje oczekiwaną nową lokalizację elementu. Poniższy zrzut ekranu przedstawia znacznik wstawiania.

zrzut ekranu przedstawiający znacznik wstawiania podczas przeciągania jednego pliku między dwoma innymi w kontrolce widoku listy

Elementy interfejsu API znacznika wstawiania umożliwiają umieszczanie markerów wstawiania, dostarczając komunikaty i flagi, które umożliwiają wykrywanie trafień oraz określają lokalizację i wygląd znacznika wstawiania według elementu, a także zapytują o informacje o bieżącym rozmiarze i wyglądzie znacznika wstawiania.

Zobacz też