Udostępnij przez


Informacje o polach kombi

Pole kombi łączy pole edycji lub tekst statyczny i listę.

Ten temat zawiera następujące sekcje.

Typy i style pól kombi

Pole kombi składa się z listy i pola wyboru. Lista zawiera opcje, które użytkownik może wybrać, a pole wyboru wyświetla bieżące zaznaczenie. Jeśli pole wyboru jest kontrolką edycji, użytkownik może wprowadzić informacje niedostępne na liście; w przeciwnym razie użytkownik może wybrać tylko elementy na liście.

Wspólna biblioteka kontrolek zawiera trzy główne style pola kombi, jak pokazano w poniższej tabeli.

Typ pola kombinowanego Stała stylu Opis
Prosty CBS_SIMPLE Wyświetla listę przez cały czas i pokazuje wybrany element w kontrolce edycji.
Lista rozwijana CBS_DROPDOWN Wyświetla listę po kliknięciu ikony i pokazuje wybrany element w kontrolce edycji.
Lista rozwijana (lista wyboru) CBS_DROPDOWNLIST Wyświetla listę po kliknięciu ikony i pokazuje wybrany element w kontrolce statycznej.

 

Poniższe zrzuty ekranu przedstawiają trzy rodzaje komboboksów, które mogą pojawić się w systemie Windows Vista. Na pierwszym zrzucie ekranu użytkownik wybrał element w prostym polu kombi. Użytkownik może również wpisać nową wartość w polu edycji tej kontrolki. Lista została dostosowana w edytorze zasobów programu Microsoft Visual Studio i jest wystarczająco duża tylko na dwa elementy.

zrzut ekranu przedstawiający element wybrany w prostym rozwijanym polu wyboru

Na drugim zrzucie ekranu użytkownik wpisał nowy tekst w kontrolce edycji pola kombi listy rozwijanej. Użytkownik mógł również wybrać istniejący element. Pole listy zostanie rozwinięte, aby pomieścić jak najwięcej elementów.

zrzut ekranu przedstawiający tekst wpisany w polu kombi listy rozwijanej

Na trzecim zrzucie ekranu użytkownik otworzył pole kombi listy rozwijanej. Pole listy zostanie rozwinięte, aby pomieścić jak najwięcej elementów. Użytkownik nie może wprowadzić nowego tekstu.

zrzut ekranu przedstawiający element wybrany w polu kombi listy rozwijanej

Istnieje również wiele stylów pól kombi, które definiują określone właściwości. Style pola kombi definiują określone właściwości pola kombi. Można łączyć style; jednak niektóre style mają zastosowanie tylko do niektórych typów kombinowanych pól wyboru. Aby uzyskać tabelę stylów pól kombi, zobacz Style pól kombi.

Notatka

Aby używać stylów wizualnych z polami kombi, aplikacja musi zawierać manifest i musi wywołać InitCommonControls na początku działania programu. Aby uzyskać informacje na temat stylów wizualizacji, zobacz Style wizualne. Aby uzyskać informacje na temat manifestów, zapoznaj się z Włączanie stylów wizualnych.

 

Lista rozwijana

Lista jest częścią pola kombi, który wyświetla elementy, które użytkownik może wybrać. Zazwyczaj aplikacja inicjuje zawartość listy podczas tworzenia pola kombi. Dowolny element listy wybrany przez użytkownika jest bieżącym wyborem. Nie można wybrać wielu elementów. W prostych i rozwijanych polach kombi użytkownik może wpisać tekst w polu wyboru zamiast wybierać element z listy. W takich przypadkach nie ma bieżącego zaznaczenia, a odpowiedzialność za dodanie elementu do listy i wybranie go jako bieżącego, jeśli jest to właściwe, należy do aplikacji.

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

Bieżące zaznaczenie

Bieżące zaznaczenie to element listy wybrany przez użytkownika; zaznaczony tekst pojawia się w polu zaznaczenia pola rozwijanego. Jednak w przypadku prostego pola kombi lub pola kombi listy rozwijanej aktualny wybór jest tylko jedną możliwą formą wprowadzania danych przez użytkownika w polu kombi. Użytkownik może również wpisać tekst w polu zaznaczenia.

Bieżący wybór jest identyfikowany przez indeks zaczynający się od zera wybranego elementu listy. Aplikacja może ustawić i pobrać ją w dowolnym momencie. Procedura okna nadrzędnego lub okna dialogowego odbiera powiadomienie, gdy użytkownik zmieni bieżące zaznaczenie pola kombi. Okno nadrzędne lub okno dialogowe nie jest powiadamiane, gdy aplikacja zmienia zaznaczenie.

Po utworzeniu pola kombi nie ma bieżącego zaznaczenia. Dotyczy to również prostego lub rozwijanego pola kombi, jeśli użytkownik edytował zawartość pola wyboru. Aby ustawić bieżący wybór, aplikacja wysyła komunikat CB_SETCURSEL do listy rozwijanej. Aplikacja może również użyć komunikatu CB_SELECTSTRING, aby ustawić bieżący wybór na element listy, którego ciąg zaczyna się od określonego ciągu. Aby określić bieżący wybór, aplikacja wysyła komunikat CB_GETCURSEL do pola kombi. Jeśli nie ma bieżącego zaznaczenia, ten komunikat zwraca CB_ERR.

Gdy użytkownik zmieni bieżące zaznaczenie w polu kombi, okno nadrzędne lub procedura okna dialogowego odbiera komunikat WM_COMMAND z kodem powiadomienia CBN_SELCHANGE w parametrze wParam. Ten kod powiadomienia nie jest wysyłany, gdy bieżące zaznaczenie jest ustawione przy użyciu komunikatu CB_SETCURSEL.

Pole kombi listy rozwijanej lub pole listy rozwijanej wysyła kod powiadomienia CBN_CLOSEUP do okna nadrzędnego lub procedury okna dialogowego, gdy lista rozwijana zostanie zamknięta. Jeśli użytkownik zmienił bieżące zaznaczenie, pole kombi również wysyła kod powiadomienia CBN_SELCHANGE po zamknięciu listy rozwijanej. Aby wykonać określony proces za każdym razem, gdy użytkownik wybierze element listy, możesz obsłużyć kod powiadomienia CBN_SELCHANGE lub CBN_CLOSEUP. Zazwyczaj należy poczekać na kod powiadomienia CBN_CLOSEUP, zanim przystąpi się do przetwarzania zmiany w aktualnym wyborze. Może to być szczególnie ważne, jeśli wymagana jest znaczna ilość przetwarzania.

Aplikacja może również przetwarzać kody powiadomień CBN_SELENDOK i CBN_SELENDCANCEL. System wysyła CBN_SELENDOK, gdy użytkownik wybierze element listy lub wybierze element, a następnie zamknie listę. Oznacza to, że użytkownik zakończył pracę i że wybór powinien zostać przetworzony. CBN_SELENDCANCEL jest wysyłany, gdy użytkownik wybierze element, ale następnie wybiera inną kontrolkę, naciska ESC, gdy lista rozwijana jest otwarta lub zamyka okno dialogowe. Oznacza to, że wybór użytkownika powinien być ignorowany. CBN_SELENDOK jest wysyłany przed każdą wiadomością CBN_SELCHANGE.

W prostym polu kombi system wysyła kod powiadomienia CBN_DBLCLK, gdy użytkownik kliknie dwukrotnie element listy. W rozwijanym polu kombi lub na liście rozwijanej pojedyncze kliknięcie powoduje jej ukrycie, więc nie można dwukrotnie kliknąć elementu.

Niektóre powiadomienia i komunikaty dotyczą tylko komboboksów zawierających listy rozwijane. Po otwarciu lub zamknięciu listy rozwijanej, okno nadrzędne pola kombi otrzymuje powiadomienie w postaci komunikatu WM_COMMAND. Jeśli lista jest otwierana, słowo wyższego rzędu wParam to CBN_DROPDOWN. Jeśli lista jest zamykana, to znaczy, że CBN_CLOSEUP.

Aplikacja może otworzyć listę pola kombi lub listy rozwijanej przy użyciu komunikatu CB_SHOWDROPDOWN. Może określić, czy lista jest otwarta przy użyciu komunikatu CB_GETDROPPEDSTATE i może określić współrzędne listy rozwijanej przy użyciu komunikatu CB_GETDROPPEDCONTROLRECT. Aplikacja może również zwiększyć szerokość listy rozwijanej przy użyciu komunikatu CB_SETDROPPEDWIDTH.

Zawartość listy

Gdy aplikacja tworzy pole kombi, zazwyczaj inicjuje pole kombi przez dodanie co najmniej jednego elementu do listy. Później aplikacja może dodawać lub usuwać elementy listy, ponownie zainicjować listę lub pobrać z niej informacje o elemencie.

Aplikacja dodaje elementy listy do pola kombi, wysyłając do niego komunikat CB_ADDSTRING. Określony element jest dodawany na końcu listy lub w posortowanym polu kombi w poprawnej posortowanej pozycji na podstawie ciągu znaków elementu. W niesortowanym polu kombi aplikacja może użyć komunikatu CB_INSERTSTRING, aby wstawić element na określonej pozycji. Po dodaniu element listy jest identyfikowany przez jego pozycję.

Korzystając z komunikatu CB_FINDSTRING lub CB_FINDSTRINGEXACT, aplikacja może określić położenie elementu listy. CB_FINDSTRING znajduje element, którego ciąg zaczyna się od określonego ciągu. CB_FINDSTRINGEXACT znajduje element, którego ciąg dokładnie pasuje do ciągu. Żadna z wiadomości nie jest wrażliwa na wielkość liter.

Aplikacja może usunąć element listy przy użyciu komunikatu CB_DELETESTRING. Jeśli aplikacja musi ponownie zainicjować listę pól kombi, może najpierw wyczyścić całą zawartość przy użyciu komunikatu CB_RESETCONTENT. Podczas dodawania wielu elementów do listy po wyświetleniu pola kombi aplikacja może wyczyścić flagę ponownego rysowania, aby zapobiec przemalowaniu pola kombi po dodaniu każdego elementu. Aby uzyskać więcej informacji na temat ponownego rysowania, zobacz opis komunikatu WM_SETREDRAW.

Aby pobrać ciąg skojarzony z elementem listy, aplikacja może użyć komunikatu CB_GETLBTEXT. Ciąg elementu jest kopiowany do buforu określonego przez aplikację. Aby upewnić się, że bufor jest wystarczająco duży, aby odebrać ciąg, aplikacja może najpierw użyć komunikatu CB_GETLBTEXTLEN w celu określenia długości ciągu. Aby uzyskać liczbę elementów listy w polu kombi, aplikacja może użyć komunikatu CB_GETCOUNT.

Edytuj pola wyboru kontrolnego

Aplikacja może pobrać lub ustawić zawartość pola wyboru i określić lub ustawić wybór edycji. Aplikacja może również ograniczyć ilość tekstu, który użytkownik może wpisać w polu zaznaczenia. Po zmianie zawartości pola wyboru system wysyła komunikaty notyfikacyjne do okna nadrzędnego lub procedury okna dialogowego.

Aby pobrać zawartość pola wyboru, aplikacja może wysłać komunikat WM_GETTEXT do pola kombi. Aby ustawić zawartość pola wyboru prostego lub rozwijanego pola kombi, aplikacja może wysłać komunikat WM_SETTEXT do pola kombi.

Zaznaczenie edycji to zakres zaznaczonego tekstu, jeśli istnieje, w polu zaznaczenia prostego lub rozwijanego pola kombinowanego. Aplikacja może określić pozycje znaków początkowych i końcowych bieżącego zaznaczenia przy użyciu komunikatu CB_GETEDITSEL. Może również wybierać znaki w zaznaczeniu edycji przy użyciu komunikatu CB_SETEDITSEL.

Początkowo ilość tekstu, który użytkownik może wpisać w polu zaznaczenia, jest ograniczona przez rozmiar pola zaznaczenia. Jeśli jednak pole kombi ma styl CBS_AUTOHSCROLL, tekst może się rozciągać poza rozmiarem pola wyboru. Aplikacja może użyć komunikatu CB_LIMITTEXT, aby ograniczyć ilość tekstu, który użytkownik może wpisać w polu wyboru, niezależnie od tego, czy kontrolka ma styl CBS_AUTOHSCROLL.

Gdy użytkownik edytuje zawartość pola wyboru, okno nadrzędne lub procedura okna dialogowego odbiera komunikaty powiadomień. Najpierw zostanie wysłany kod powiadomienia CBN_EDITUPDATE wskazujący, że tekst w polu zaznaczenia został edytowany. Po wyświetleniu zmienionego tekstu system wysyła CBN_EDITCHANGE. Gdy zawartość pola wyboru zmienia się w wyniku wybrania elementu listy, te komunikaty nie są wysyłane.

Owner-Drawn pola kombi

Aplikacja może utworzyć pole kombi z własnym rysowaniem, aby przejąć odpowiedzialność za malowanie elementów listy. Okno nadrzędne combo boxa tworzonego przez właściciela (jego właściciela) odbiera WM_DRAWITEM komunikat, gdy część combo boxa musi być namalowana. Lista rozwijana rysowana przez użytkownika może zawierać nie tylko ciągi tekstowe, ale i inne informacje. Komboboksy tworzone przez właściciela mogą być dowolnego typu. Jednak kontrolka edycji w prostym lub rozwijanym polu kombi może wyświetlać tylko tekst, podczas gdy właściciel maluje pole wyboru w polu listy rozwijanej.

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

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

Właściciel pola kombi narysowanego przez właściciela może przetworzyć komunikat WM_MEASUREITEM w celu określenia wymiarów elementów listy w polu kombi. Jeśli aplikacja tworzy pole kombi przy użyciu stylu CBS_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 CBS_OWNERDRAWVARIABLE, system wysyła komunikat WM_MEASUREITEM dla każdego elementu listy dodanego do pola kombi. Właściciel może określić lub ustawić wysokość elementu listy w dowolnym momencie, używając odpowiednio CB_GETITEMHEIGHT i CB_SETITEMHEIGHT komunikatów.

Jeśli informacje wyświetlane w definiowanym przez użytkownika polu kombi zawierają tekst, aplikacja może śledzić tekst dla każdego elementu listy, określając styl CBS_HASSTRINGS. Pola kombi ze stylem CBS_SORT są sortowane na podstawie tego tekstu. Jeśli pole kombi jest posortowane, ale nie w stylu CBS_HASSTRINGS, właściciel musi przetworzyć komunikat WM_COMPAREITEM.

W liście rozwijanej tworzonej przez właściciela, właściciel musi śledzić elementy listy zawierające informacje inne niż tekst lub dodatkowo oprócz tekstu. Jednym z wygodnych sposobów jest zapisanie dojścia do informacji jako danych elementu. Aby zwolnić obiekty danych powiązane z elementami w polu kombi, właściciel może przetworzyć wiadomość WM_DELETEITEM.

Podklasowane pola kombi

Podklasowanie to procedura umożliwiająca aplikacji przechwytywanie i przetwarzanie komunikatów wysyłanych lub publikowanych w oknie. Używając podklasy, aplikacja może zastąpić własne przetwarzanie niektórych komunikatów, pozostawiając większość przetwarzania komunikatów do procedury okna zdefiniowanej przez klasę.

Gdy system operacyjny tworzy okno, zapisuje informacje o nim w wewnętrznej strukturze danych, która zawiera wskaźnik do procedury okna. Aby podklasować okno, aplikacja wywołuje funkcję SetClassLong, aby zastąpić wskaźnik do tej procedury wskaźnikiem do procedury podklasy zdefiniowanej przez aplikację. Następnie wszystkie komunikaty do okna są wysyłane do procedury podklasy. Ta procedura używa następnie funkcji CallWindowProc do przekazywania nieprzetworzonych komunikatów do oryginalnej procedury okna. Aby uzyskać opis przetwarzania komunikatów wykonywanego przez procedurę okna klasy COMBOBOX, zobacz domyślne zachowanie pola kombi.

Gdy pole kombi znajduje się poza oknem dialogowym, aplikacja nie może przetworzyć klawiszy TAB, ENTER i ESC, chyba że używa do tego procedury podklasy. Gdy proste lub rozwijane pole kombi odbiera fokus wejściowy, natychmiast ustawia fokus na kontrolkę edycji podrzędnej. W związku z tym aplikacja musi podklasować kontrolkę edycji, aby przechwycić dane wejściowe klawiatury dla prostego lub rozwijanego pola kombi. Aby zapoznać się z tym przykładem, zobacz Podklasowanie pola kombi.

Jeśli procedura podklasy przetwarza komunikat WM_PAINT, musi użyć funkcji BeginPaint, aby przygotować się do malowania. Przed wywołaniem funkcji EndPaint przekazuje dojście kontekstu urządzenia (DC) jako parametr wParam dla procedury okna. Jeśli EndPaint zostaje wywołany jako pierwszy, procedura okna klasy nie wykonuje malowania, ponieważ EndPaint waliduje całe okno.

Technika związana z tworzeniem podklas to tworzenie superklas. Superklasa przypomina dowolną inną klasę, z tą różnicą, że procedura okna nie wywołuje DefWindowProc do obsługi nieprzetworzonych komunikatów. Zamiast tego przekazuje nieprzetworzone komunikaty do procedury okna dla klasy okna nadrzędnego. Postępuj zgodnie z wytycznymi w Procedury okien, aby uniknąć problemów, które mogą wystąpić przy podklasowaniu i superklasowaniu.