Udostępnij przez


O listboxach

Kontrolka pola listy zawiera prostą listę, z której użytkownik może zazwyczaj wybierać co najmniej jeden element. Pola listy zapewniają ograniczoną elastyczność w porównaniu z kontrolkami widoku listy.

Elementy pola listy mogą być reprezentowane przez ciągi tekstowe, mapy bitowe lub oba te elementy. Jeśli pole listy nie jest wystarczająco duże, aby wyświetlić wszystkie elementy pola listy jednocześnie, pole listy zawiera pasek przewijania. Użytkownik przewija elementy pola listy i stosuje lub usuwa stan zaznaczenia w razie potrzeby. Wybranie elementu pola listy zmienia jego wygląd, zazwyczaj przez zmianę kolorów tekstu i tła na określone przez odpowiednie metryki systemu operacyjnego. Gdy użytkownik wybiera lub usuwa zaznaczenie elementu, system wysyła komunikat powiadomienia do okna nadrzędnego pola listy.

W przypadku aplikacji ANSI system konwertuje tekst w polu listy na Unicode przy użyciu strony kodowej CP_ACP. Może to powodować problemy. Na przykład znaki łacińskie z akcentami w polu listy nie-Unicode w japońskiej wersji systemu Windows zostaną wyświetlone w formie nieczytelnej. Aby rozwiązać ten problem, skompiluj aplikację jako Unicode lub użyj listy rysowanej przez użytkownika.

W tej sekcji omówiono następujące tematy:

Tworzenie pola listy

Najprostszym sposobem utworzenia pola listy w oknie dialogowym jest przeciągnięcie je z przybornika w programie Microsoft Visual Studio do zasobu okna dialogowego. Aby dynamicznie utworzyć pole listy lub utworzyć pole listy w oknie innym niż okno dialogowe, użyj funkcji CreateWindowEx, określając klasę okna WC_LISTBOX i odpowiednie style pól listy .

Typy i style pól listy

Istnieją dwa typy pól listy: wybór pojedynczy (domyślny) i wybór wielokrotny. W polu listy z jednym wyborem użytkownik może wybrać tylko jeden element naraz. W polu listy z wielokrotnym zaznaczeniem użytkownik może wybrać jednocześnie więcej niż jeden element. Aby utworzyć pole listy wielokrotnego wyboru, określ LBS_MULTIPLESEL lub styl LBS_EXTENDEDSEL.

Wygląd i działanie pola listy są kontrolowane przez style pól listy i okien. Te style wskazują, czy lista jest sortowana, rozmieszczona w wielu kolumnach, rysowana przez aplikację itd. Wymiary i style pola listy są zwykle definiowane w szablonie okna dialogowego, który znajduje się w zasobach aplikacji.

Notatka

Aby używać stylów wizualizacji z tymi kontrolkami, aplikacja musi zawierać manifest i musi wywołać InitCommonControls na początku programu. Aby uzyskać informacje na temat stylów wizualizacji, zobacz Style wizualne. Aby uzyskać informacje na temat manifestów, odwołaj się do Włączanie stylów wizualnych.

Funkcje pola listowego

Funkcja DlgDirList zastępuje zawartość pola listy nazwami dysków, katalogów i plików spełniających określony zestaw kryteriów. Funkcja DlgDirSelectEx pobiera bieżące zaznaczenie z pola listy, które zostało zainicjowane przez DlgDirList. Te funkcje umożliwiają użytkownikowi wybranie dysku, katalogu lub pliku z pola listy bez wpisywania lokalizacji i nazwy pliku.

Ponadto funkcja GetListBoxInfo zwraca liczbę elementów na kolumnę w określonym polu listy.

Komunikaty powiadomień z pól listy

Gdy zdarzenie występuje w polu listy, pole listy wysyła kod powiadomienia w postaci komunikatu WM_COMMAND do procedury okna dialogowego właściciela. Kody powiadomień pola listy są wysyłane, gdy użytkownik wybiera, klika dwukrotnie lub anuluje element pola listy; gdy pole listy odbiera lub traci fokus klawiatury; a gdy system nie może przydzielić wystarczającej ilości pamięci dla żądania pola listy. Komunikat WM_COMMAND zawiera identyfikator pola listy w niższym bajcie parametru wParam oraz kod powiadomienia w wyższym bajcie. Parametr lParam zawiera uchwyt okna sterowania.

Procedura okna dialogowego nie jest wymagana do przetwarzania tych komunikatów; domyślna procedura okna przetwarza je.

Aplikacja powinna monitorować i przetwarzać następujące kody powiadomień w polu listy.

Kod powiadomienia Opis
LBN_DBLCLK Użytkownik dwukrotnie klika element w polu listy.
LBN_ERRSPACE Pole listy nie może przydzielić wystarczającej ilości pamięci, aby spełnić żądanie.
LBN_KILLFOCUS Pole listy traci fokus klawiatury.
LBN_SELCANCEL Użytkownik anuluje wybór elementu w polu listy.
LBN_SELCHANGE Wybór w polu listy ma ulec zmianie.
LBN_SETFOCUS Pole listy odbiera fokus klawiatury.

Wiadomości do pól listowych

Procedura okna dialogowego umożliwia wysyłanie komunikatów do pola listy w celu dodawania, usuwania, sprawdzania i zmieniania elementów pola listy. Na przykład procedura okna dialogowego może wysłać komunikat LB_ADDSTRING do pola listy, aby dodać element, oraz komunikat LB_GETSEL w celu określenia, czy element jest wybrany. Inne komunikaty ustawiają i pobierają informacje o rozmiarze, wyglądzie i zachowaniu pola listy. Na przykład komunikat LB_SETHORIZONTALEXTENT ustawia przewijaną szerokość pola listy. Procedura okna dialogowego może wysyłać dowolny komunikat do pola listy przy użyciu funkcji SendMessage lub SendDlgItemMessage.

Element listy jest często określany przez jego indeks, czyli liczbę całkowitą reprezentującą pozycję elementu w liście. Indeks pierwszego elementu w polu listy to 0, indeks drugiego elementu to 1 itd.

W poniższej tabeli opisano sposób, w jaki wstępnie zdefiniowana procedura pola listy odpowiada na komunikaty pól listy.

Komunikat Odpowiedź
LB_ADDFILE Wstawia plik do pola listy katalogów wypełnionego przez funkcję DlgDirList i pobiera indeks pola listy wstawionego elementu.
LB_ADDSTRING Dodaje ciąg do pola listy i zwraca jego indeks.
LB_DELETESTRING Usuwa ciąg z pola listy i zwraca liczbę ciągów, które pozostają na liście.
LB_DIR Dodaje listę nazw plików do pola listy i zwraca indeks dodanej nazwy pliku.
LB_FINDSTRING Zwraca indeks pierwszego ciągu w polu listy rozpoczynającym się od określonego ciągu.
LB_FINDSTRINGEXACT Zwraca indeks ciągu w polu listy, który jest równy określonemu ciągowi.
LB_GETANCHORINDEX Zwraca indeks elementu, który ostatnio wybrano myszą.
LB_GETCARETINDEX Zwraca indeks elementu, który ma prostokąt fokusu.
LB_GETCOUNT Zwraca liczbę elementów w polu listy.
LB_GETCURSEL Zwraca indeks aktualnie wybranego elementu.
LB_GETHORIZONTALEXTENT Zwraca szerokość przewijaną w pikselach pola listowego.
LB_GETITEMDATA Zwraca wartość skojarzona z określonym elementem.
LB_GETITEMHEIGHT Zwraca wysokość w pikselach elementu w polu listy.
LB_GETITEMRECT Pobiera współrzędne klienta określonego elementu pola listy.
LB_GETLOCALE Pobiera ustawienia regionalne listy wyboru. Wyraz o wysokiej kolejności zawiera kod kraju/regionu, a wyraz o niskiej kolejności zawiera identyfikator języka.
LB_GETSEL Zwraca stan zaznaczenia elementu pola listy.
LB_GETSELCOUNT Zwraca liczbę zaznaczonych elementów w polu listy wielokrotnego wyboru.
LB_GETSELITEMS Tworzy tablicę indeksów wszystkich zaznaczonych elementów w liście wielokrotnego wyboru i zwraca całkowitą liczbę wybranych elementów.
LB_GETTEXT Pobiera ciąg skojarzony z określonym elementem i długością ciągu.
LB_GETTEXTLEN Zwraca długość ciągu skojarzonego z określonym elementem w znakach.
LB_GETTOPINDEX Zwraca indeks pierwszego widocznego elementu w polu listy.
LB_INITSTORAGE Przydziela pamięć dla określonej liczby elementów i skojarzonych z nimi ciągów.
LB_INSERTSTRING Wstawia ciąg w określonym indeksie w polu listy.
LB_ITEMFROMPOINT Pobiera indeks zerowy elementu najbliższego określonego punktu w polu listy.
LB_RESETCONTENT Usuwa wszystkie elementy z pola listy.
LB_SELECTSTRING Wybiera pierwszy ciąg, który znajduje, który pasuje do określonego prefiksu.
LB_SELITEMRANGE Wybiera określony zakres elementów w polu listy.
LB_SELITEMRANGEEX Wybiera określony zakres elementów, jeśli indeks pierwszego elementu w zakresie jest mniejszy niż indeks ostatniego elementu w zakresie. Anuluje zaznaczenie w zakresie, jeśli indeks pierwszego elementu jest większy niż ostatni.
LB_SETANCHORINDEX Ustawia element ostatnio wybrany przez mysz do określonego elementu.
LB_SETCARETINDEX Ustawia prostokąt fokusu na określony element pola listy.
LB_SETCOLUMNWIDTH Ustawia szerokość w pikselach wszystkich kolumn w polu listy.
LB_SETCOUNT Ustawia liczbę elementów w polu listy.
LB_SETCURSEL Wybiera określony element pola listy.
LB_SETHORIZONTALEXTENT Ustawia szerokość przewijaną w pikselach dla pola listy.
LB_SETITEMDATA Kojarzy wartość z elementem pola listy.
LB_SETITEMHEIGHT Ustawia wysokość w pikselach elementu lub elementów w polu listy.
LB_SETLOCALE Ustawia ustawienia regionalne pola listy i zwraca poprzedni identyfikator ustawień regionalnych.
LB_SETSEL Wybiera element w polu listy wielokrotnego wyboru.
LB_SETTABSTOPS Ustawia tabulatory na te określone w określonej tablicy.
LB_SETTOPINDEX Przewija pole listy, aby określony element był w górnej części widocznego zakresu.

Domyślne przetwarzanie komunikatów okna

Procedura okna dla wstępnie zdefiniowanej klasy okna listy wykonuje domyślne przetwarzanie dla wszystkich komunikatów, które pole listy nie przetwarza. Gdy procedura pola listy zwraca wartość FALSE dla komunikatu, wstępnie zdefiniowana procedura okna sprawdza komunikat i wykonuje akcje domyślne, co przedstawiono w poniższej tabeli.

Komunikat Akcja domyślna
WM_CHAR Przenosi zaznaczenie do pierwszego elementu rozpoczynającego się od znaku wpisanego przez użytkownika. Jeśli pole listy ma styl LBS_OWNERDRAW, nie ma żadnej akcji. Wiele znaków wpisanych w krótkim interwale jest traktowanych jako grupa, a pierwszy element rozpoczynający się od tej serii znaków jest zaznaczony.
WM_CREATE Tworzy puste pole listy.
WM_DESTROY Niszczy pole listy i zwalnia wszystkie używane zasoby.
Przekazuje komunikat do procedury okna dialogowego lub procesu okna nadrzędnego.
WM_ENABLE Jeśli kontrolka jest widoczna, unieważnia prostokąt, aby ciągi mogły być malowane szaro.
WM_ERASEBKGND Usuwa tło pola listy. Jeśli pole listy ma styl LBS_OWNERDRAW, tło nie jest wymazane.
WM_GETDLGCODE Zwraca DLGC_WANTARROWS | DLGC_WANTCHARS, wskazując, że domyślna procedura pola listy przetwarza klawisze strzałek i komunikaty WM_CHAR.
WM_GETFONT Zwraca uchwyt do bieżącej czcionki pola listy.
WM_HSCROLL Przewija pole listy w poziomie.
WM_KEYDOWN Przetwarza wirtualne przyciski do przewijania. Klucz wirtualny to indeks elementu, do którego ma być przeniesiony kursor. Zaznaczenie nie jest zmieniane.
WM_KILLFOCUS Wyłącza kursor i niszczy go. Wysyła kod powiadomienia LBN_KILLFOCUS do właściciela pola listy.
WM_LBUTTONDBLCLK Śledzi mysz w obszarze roboczym pola listy. Dzięki temu użytkownik może anulować wybór, jeśli przycisk myszy zostanie zwolniony poza obszarem klienta pola listy.
WM_LBUTTONDOWN Śledzi mysz w obszarze roboczym pola wyboru listy. Dzięki temu użytkownik może anulować wybór, jeśli przycisk myszy zostanie zwolniony poza obszarem klienta pola listy.
WM_LBUTTONUP Śledzi mysz w obszarze klienta listy. Dzięki temu użytkownik może anulować wybór, jeśli przycisk myszy zostanie zwolniony poza obszarem klienta pola listy.
WM_MOUSEMOVE Śledzenie ruchu myszy w obszarze klienta listy. Dzięki temu użytkownik może anulować wybór, jeśli przycisk myszy zostanie zwolniony poza obszarem klienta pola listy.
WM_PAINT Wykonuje operację malowania w podklasie, korzystając z uchwytu kontekstu urządzenia (DC) pola listy.
WM_SETFOCUS Włącza kursor i wysyła kod powiadomienia LBN_SETFOCUS do właściciela listy wyboru.
WM_SETFONT Ustawia nową czcionkę pola listy.
WM_SETREDRAW Ustawia lub czyści flagę redraw na podstawie wartości wParam.
WM_SIZE Zmienia rozmiar pola listy do pełnej liczby elementów.
WM_VSCROLL Przewija pole listy w pionie.

Wstępnie zdefiniowana procedura pola listy przekazuje wszystkie inne komunikaty do DefWindowProc na potrzeby przetwarzania domyślnego.

pola wyboru listy Owner-Drawn

Aplikacja może utworzyć rysowane przez właściciela pole listy, aby przejąć odpowiedzialność za rysowanie elementów listy. Okno nadrzędne lub okno dialogowe listy rozwijanej rysowanej przez właściciela (jego właściciel) odbiera wiadomości WM_DRAWITEM, gdy część listy rozwijanej musi być przerysowana. Pole listy narysowanej przez właściciela może zawierać informacje inne niż lub oprócz ciągów tekstowych.

Właściciel pola listy narysowanej przez właściciela musi przetworzyć komunikat WM_DRAWITEM. Ta wiadomość jest wysyłana za każdym razem, gdy część pola listy musi zostać ponownie wyrysowana. Właściciel może wymagać przetworzenia innych komunikatów, w zależności od stylów określonych dla pola listy.

Aplikacja może utworzyć pole listy narysowanej przez właściciela, określając styl LBS_OWNERDRAWFIXED lub LBS_OWNERDRAWVARIABLE. Jeśli wszystkie elementy listy w polu listy mają taką samą wysokość, jak ciągi lub ikony, aplikacja może użyć stylu LBS_OWNERDRAWFIXED. Jeśli elementy listy mają różną wysokość (na przykład mapy bitowe o różnym rozmiarze), aplikacja może użyć stylu LBS_OWNERDRAWVARIABLE.

Właściciel pola listy narysowanej przez właściciela może przetworzyć komunikat WM_MEASUREITEM w celu określenia wymiarów elementów listy. Jeśli aplikacja tworzy pole listy przy użyciu stylu LBS_OWNERDRAWFIXED, system wysyła komunikat WM_MEASUREITEM tylko raz. Wymiary określone przez właściciela są używane dla wszystkich elementów listy. Jeśli jest używany styl LBS_OWNERDRAWVARIABLE, system wysyła komunikat WM_MEASUREITEM dla każdego elementu listy dodanego do pola listy. Właściciel może określić lub ustawić wysokość elementu listy w dowolnym momencie, używając odpowiednio komunikatów LB_GETITEMHEIGHT i LB_SETITEMHEIGHT.

Jeśli informacje wyświetlane w polu listy narysowanej przez właściciela zawierają tekst, aplikacja może śledzić tekst dla każdego elementu listy, określając styl LBS_HASSTRINGS. Pola listy ze stylem LBS_SORT są sortowane na podstawie tego tekstu. Jeśli pole listy jest posortowane, ale nie ma stylu LBS_HASSTRINGS, właściciel musi przetworzyć wiadomość WM_COMPAREITEM.

W polu listy rysowanym przez właściciela, właściciel musi śledzić elementy listy zawierające informacje inne niż lub oprócz tekstu. Jednym wygodnym sposobem na to jest zapisanie odwołania do informacji jako danych elementu, korzystając z komunikatu LB_SETITEMDATA. Aby zwolnić obiekty danych skojarzone z elementami w polu listy, właściciel może przetworzyć komunikat WM_DELETEITEM.

Aby zapoznać się z przykładem pola listy rysowanej przez właściciela, zobacz How to Create an Owner-Drawn List Box (Jak utworzyć pole listy Owner-Drawn).

Przeciągnij pola listy

Pole listy przeciągania to specjalny typ pola listy, który umożliwia użytkownikowi przeciąganie elementów z jednej pozycji do innej. Aplikacja może użyć pola listy przeciągania, aby wyświetlić ciągi w określonej sekwencji i umożliwić użytkownikowi zmianę sekwencji, przeciągając elementy do pozycji.

Tworzenie pól listy przeciągania

Pola listy przeciągania mają te same style okien i przetwarzają te same komunikaty co standardowe pola listy. Aby utworzyć pole listy przeciągania, najpierw utwórz standardowe pole listy, a następnie wywołaj funkcję MakeDragList. Aby przekonwertować pole listy w oknie dialogowym na przeciąganie pola listy, możesz wywołać MakeDragList podczas przetwarzania komunikatu WM_INITDIALOG.

Przeciągnij wiadomości listy

Pole listy do przeciągania powiadamia nadrzędne okno o zdarzeniach przeciągania, wysyłając do niego komunikat listy przeciągania. Okno nadrzędne musi przetworzyć komunikat przeciągania listy.

Pole listy przeciągania rejestruje ten komunikat po wywołaniu funkcji MakeDragList. Aby pobrać identyfikator komunikatu (wartość liczbowa) komunikatu przeciągania listy, wywołaj funkcję RegisterWindowMessage i określ wartość DRAGLISTMSGSTRING.

Parametr wParam komunikatu przeciągania listy jest identyfikatorem kontrolki pola listy przeciągania. Parametr lParam jest adresem struktury DRAGLISTINFO, która zawiera kod powiadomienia dla zdarzenia przeciągania i inne informacje. Wartość zwrotna wiadomości zależy od powiadomienia.

Przeciągnij kody powiadomień pola listy

Kod powiadomienia listy przeciągania, który jest identyfikowany przez członka uNotification struktury DRAGLISTINFO dołączonej do komunikatu listy przeciągania, może być DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGlub DL_DROPPED.

Kod powiadomienia DL_BEGINDRAG jest wysyłany, gdy kursor znajduje się w elemencie listy, a użytkownik klika lewy przycisk myszy. Okno nadrzędne może zwrócić true, aby rozpocząć operację przeciągania lub FALSE, aby nie zezwalać na przeciąganie. W ten sposób okno nadrzędne może włączyć przeciąganie niektórych elementów listy i wyłączyć je dla innych. Można określić, który element listy znajduje się w określonej lokalizacji, używając funkcjiLBItemFromPt.

W przypadku efektu przeciągania kod powiadomienia DL_DRAGGING jest wysyłany za każdym razem, gdy mysz zostanie przeniesiona lub w regularnych odstępach czasu, jeśli mysz nie jest przenoszona. Okno nadrzędne powinno najpierw określić element listy pod kursorem przy użyciu LBItemFromPt, a następnie narysować ikonę wstawiania przy użyciu funkcji DrawInsert. Określając TRUE dla parametru bAutoScroll w LBItemFromPt, można spowodować przewijanie pola listy o jeden wiersz, jeśli kursor znajduje się powyżej lub poniżej jego obszaru klienta. Wartość zwracana dla tego powiadomienia określa typ kursora myszy, który należy ustawić w polu listy przeciągania.

Kod powiadomienia DL_CANCELDRAG jest wysyłany, jeśli użytkownik anuluje operację przeciągania, klikając prawym przyciskiem myszy lub naciskając ESC. Kod powiadomienia DL_DROPPED jest wysyłany, jeśli użytkownik ukończy operację przeciągania, zwalniając lewy przycisk myszy, nawet jeśli kursor nie znajduje się na elemencie listy. Pole listy rozwijanej zwalnia przechwytywanie myszy przed wysłaniem jakiegokolwiek powiadomienia. Wartość zwracana tych dwóch powiadomień jest ignorowana. Przeciągnij listę