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.
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
- typy pól listy i style
- funkcje pól listy
- wiadomości powiadomień z pól listy
- wiadomości do okienek listy
- Domyślne przetwarzanie komunikatów dla okna
- Owner-Drawn listy wyboru
- przeciąganie pól listy
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ę