Informationen zu Kombinationsfeldern
Ein Kombinationsfeld kombiniert ein Bearbeitungsfeld oder statischen Text und eine Liste.
Dieses Thema enthält folgende Abschnitte:
- Kombinationsfeldtypen und -stile
- Kombinationsfeldliste
- Bearbeiten von Steuerelementauswahlfeldern
- Vom Besitzer gezeichnete Kombinationsfelder
- Unterklassen-Kombinationsfelder
Kombinationsfeldtypen und -stile
Ein Kombinationsfeld besteht aus einer Liste und einem Auswahlfeld. In der Liste werden die Optionen angezeigt, die ein Benutzer auswählen kann, und im Auswahlfeld wird die aktuelle Auswahl angezeigt. Wenn das Auswahlfeld ein Bearbeitungssteuerelement ist, kann der Benutzer Informationen eingeben, die in der Liste nicht verfügbar sind. Andernfalls kann der Benutzer nur Elemente in der Liste auswählen.
Die Bibliothek für allgemeine Steuerelemente enthält drei Hauptstile des Kombinationsfelds, wie in der folgenden Tabelle gezeigt.
| Kombinationsfeldtyp | Stilkonstante | BESCHREIBUNG |
|---|---|---|
| Einfach | CBS _ SIMPLE | Zeigt die Liste jederzeit an und zeigt das ausgewählte Element in einem Bearbeitungssteuerelement an. |
| Drop-down | _CBS-DROPDOWNLISTE | Zeigt die Liste an, wenn auf das Symbol geklickt wird, und zeigt das ausgewählte Element in einem Bearbeitungssteuerelement an. |
| Dropdownliste (Dropdownliste) | _CBS-DROPDOWNLISTE | Zeigt die Liste an, wenn auf das Symbol geklickt wird, und zeigt das ausgewählte Element in einem statischen Steuerelement an. |
Die folgenden Screenshots zeigen jeweils die drei Arten von Kombinationsfeld, wie sie in Windows Vista angezeigt werden können. Im ersten Screenshot hat der Benutzer ein Element im einfachen Kombinationsfeld ausgewählt. Der Benutzer kann auch einen neuen Wert in das Bearbeitungsfeld dieses Steuerelements eingeben. Die Größe der Liste wurde im Microsoft Visual Studio Ressourcen-Editor angepasst und ist nur groß genug, um zwei Elemente aufzunehmen.

Im zweiten Screenshot hat der Benutzer neuen Text in das Bearbeitungssteuerelement des Dropdown-Kombinationsfelds eingegeben. Der Benutzer hätte auch ein vorhandenes Element auswählen können. Das Listenfeld wird erweitert, um so viele Elemente wie möglich aufzunehmen.

Im dritten Screenshot hat der Benutzer das Dropdownlisten-Kombinationsfeld geöffnet. Das Listenfeld wird erweitert, um so viele Elemente wie möglich aufzunehmen. Der Benutzer kann keinen neuen Text eingeben.

Es gibt auch eine Reihe von Kombinationsfeldstilen, die bestimmte Eigenschaften definieren. Kombinationsfeldstile definieren bestimmte Eigenschaften eines Kombinationsfelds. Sie können Stile kombinieren. einige Stile gelten jedoch nur für bestimmte Kombinationsfeldtypen. Eine Tabelle mit Kombinationsfeldstilen finden Sie unter Kombinationsfeldstile.
Hinweis
Um visuelle Stile mit Kombinationsfeldern zu verwenden, muss eine Anwendung ein Manifest enthalten und InitCommonControls am Anfang des Programms aufrufen. Informationen zu visuellen Stilen finden Sie unter Visuelle Stile. Informationen zu Manifesten finden Sie unter Aktivieren von visuellen Stilen.
Kombinationsfeldliste
Die Liste ist der Teil eines Kombinationsfelds, in dem die Elemente angezeigt werden, die ein Benutzer auswählen kann. In der Regel initialisiert eine Anwendung den Inhalt der Liste, wenn sie ein Kombinationsfeld erstellt. Jedes vom Benutzer ausgewählte Listenelement ist die aktuelle Auswahl. Mehrere Elemente können nicht ausgewählt werden. In einfachen Kombinationsfeldern und Dropdownfeldern kann der Benutzer in das Auswahlfeld eingeben, anstatt ein Listenelement auszuwählen. In diesen Fällen gibt es keine aktuelle Auswahl, und es liegt in der Verantwortung der Anwendung, das Element der Liste hinzuzufügen und es zur aktuellen Auswahl zu machen, sofern dies geeignet ist.
In diesem Abschnitt werden die folgenden Themen behandelt:
Aktuelle Auswahl
Die aktuelle Auswahl ist ein Listenelement, das der Benutzer ausgewählt hat. Der ausgewählte Text wird im Auswahlfeld des Kombinationsfelds angezeigt. Bei einem einfachen Kombinationsfeld oder einem Dropdown-Kombinationsfeld ist die aktuelle Auswahl jedoch nur eine Form möglicher Benutzereingaben in einem Kombinationsfeld. Der Benutzer kann auch Text in das Auswahlfeld eingeben.
Die aktuelle Auswahl wird durch den nullbasierten Index des ausgewählten Listenelements identifiziert. Eine Anwendung kann sie jederzeit festlegen und abrufen. Die übergeordnete Fenster- oder Dialogfeldprozedur empfängt eine Benachrichtigung, wenn der Benutzer die aktuelle Auswahl für ein Kombinationsfeld ändert. Das übergeordnete Fenster oder Dialogfeld wird nicht benachrichtigt, wenn die Anwendung die Auswahl ändert.
Wenn ein Kombinationsfeld erstellt wird, gibt es keine aktuelle Auswahl. Dies gilt auch für ein einfaches Kombinationsfeld oder Dropdown-Kombinationsfeld, wenn der Benutzer den Inhalt des Auswahlfelds bearbeitet hat. Um die aktuelle Auswahl festzulegen, sendet eine Anwendung die CB _ SETCURSEL-Nachricht an das Kombinationsfeld. Eine Anwendung kann auch die CB _ SELECTSTRING-Nachricht verwenden, um die aktuelle Auswahl auf ein Listenelement festzulegen, dessen Zeichenfolge mit einer angegebenen Zeichenfolge beginnt. Um die aktuelle Auswahl zu bestimmen, sendet eine Anwendung die CB _ GETCURSEL-Nachricht an das Kombinationsfeld. Wenn keine aktuelle Auswahl vorhanden ist, gibt diese Meldung CB _ ERR zurück.
Wenn der Benutzer die aktuelle Auswahl in einem Kombinationsfeld ändert, empfängt das übergeordnete Fenster oder die Dialogfeldprozedur eine WM _ COMMAND-Meldung mit dem CBN SELCHANGE-Benachrichtigungscode _ im Hochreihenfolgewort des wParam-Parameters. Dieser Benachrichtigungscode wird nicht gesendet, wenn die aktuelle Auswahl mithilfe der CB _ SETCURSEL-Nachricht festgelegt wird.
Ein Dropdown-Kombinationsfeld oder Dropdown-Listenfeld sendet den CBN CLOSEUP-Benachrichtigungscode _ an das übergeordnete Fenster oder die Dialogfeldprozedur, wenn die Dropdownliste geschlossen wird. Wenn der Benutzer die aktuelle Auswahl geändert hat, sendet das Kombinationsfeld auch den CBN SELCHANGE-Benachrichtigungscode, _ wenn die Dropdownliste geschlossen wird. Um jedes Mal, wenn der Benutzer ein Listenelement auswählt, einen bestimmten Prozess auszuführen, können Sie entweder den CBN _ SELCHANGE- oder CBN _ CLOSEUP-Benachrichtigungscode verarbeiten. In der Regel warten Sie auf den CBN _ CLOSEUP-Benachrichtigungscode, bevor Sie eine Änderung in der aktuellen Auswahl verarbeiten. Dies kann besonders wichtig sein, wenn ein erheblicher Verarbeitungsaufwand erforderlich ist.
Eine Anwendung kann auch die Benachrichtigungscodes CBN _ SELENDOK und CBN _ SELENDCANCEL verarbeiten. Das System sendet CBN _ SELENDOK, wenn der Benutzer ein Listenelement auswählt oder ein Element auswählt und dann die Liste schließt. Dies gibt an, dass der Benutzer fertig ist und die Auswahl verarbeitet werden soll. CBN _ SELENDCANCEL wird gesendet, wenn der Benutzer ein Element auswählt, dann aber ein anderes Steuerelement auswählt, ESC drückt, während die Dropdownliste geöffnet ist, oder schließt das Dialogfeld. Dies gibt an, dass die Auswahl des Benutzers ignoriert werden soll. CBN _ SELENDOK wird vor jeder CBN _ SELCHANGE-Nachricht gesendet.
In einem einfachen Kombinationsfeld sendet das System den CBN DBLCLK-Benachrichtigungscode, _ wenn der Benutzer auf ein Listenelement doppelklickt. In einem Dropdown-Kombinationsfeld oder einer Dropdownliste blendet ein einziger Klick die Liste aus, sodass es nicht möglich ist, auf ein Element zu doppelklicken.
Dropdownlisten
Bestimmte Benachrichtigungen und Nachrichten gelten nur für Kombinationsfelder mit Dropdownlisten. Wenn eine Dropdownliste geöffnet oder geschlossen ist, empfängt das übergeordnete Fenster eines Kombinationsfelds eine Benachrichtigung in Form einer WM _ COMMAND-Meldung. Wenn die Liste geöffnet wird, lautet das obere Wort von wParam CBN _ DROPDOWN. Wenn die Liste geschlossen wird, lautet sie CBN _ CLOSEUP.
Eine Anwendung kann die Liste eines Dropdown-Kombinationsfelds oder Dropdown-Listenfelds mithilfe der CB _ SHOWDROPDOWN-Meldung öffnen. Sie kann mithilfe der CB _ GETDROPPEDSTATE-Nachricht ermitteln, ob die Liste geöffnet ist, und die Koordinaten einer Dropdownliste mithilfe der CB _ GETDROPPEDCONTROLRECT-Nachricht bestimmen. Eine Anwendung kann auch die Breite einer Dropdownliste mithilfe der CB _ SETDROPPEDWIDTH-Nachricht erhöhen.
Inhalt auflisten
Wenn eine Anwendung ein Kombinationsfeld erstellt, initialisiert sie in der Regel das Kombinationsfeld, indem mindestens ein Element zur Liste hinzugefügt wird. Später kann eine Anwendung Listenelemente hinzufügen oder löschen, die Liste erneut initialisieren oder Elementinformationen daraus abrufen.
Eine Anwendung fügt einem Kombinationsfeld Listenelemente hinzu, indem sie die CB _ ADDSTRING-Nachricht an das Feld sendet. Das angegebene Element wird am Ende der Liste oder in einem sortierten Kombinationsfeld an der richtigen sortierten Position basierend auf der Zeichenfolge des Elements hinzugefügt. In einem unsortierten Kombinationsfeld kann eine Anwendung mithilfe der CB _ INSERTSTRING-Meldung ein Element an einer bestimmten Position einfügen. Nach dem Hinzufügen wird ein Listenelement anhand seiner Position identifiziert.
Mithilfe der CB _ FINDSTRING- oder CB _ FINDSTRINGEXACT-Nachricht kann eine Anwendung die Position eines Listenelements bestimmen. CB _ FINDSTRING sucht ein Element, dessen Zeichenfolge mit der angegebenen Zeichenfolge beginnt. CB _ FINDSTRINGEXACT sucht ein Element, dessen Zeichenfolge genau mit der Zeichenfolge entspricht. Bei keiner der Nachrichten wird die Kleinschreibung beachtet.
Eine Anwendung kann ein Listenelement mithilfe der CB _ DELETESTRING-Meldung entfernen. Wenn eine Anwendung die Kombinationsfeldliste erneut initialisieren muss, kann sie zuerst den gesamten Inhalt löschen, indem sie die CB _ RESETCONTENT-Meldung verwendet. Wenn der Liste mehrere Elemente hinzugefügt werden, nachdem ein Kombinationsfeld bereits angezeigt wurde, kann eine Anwendung das Neuzeichnet-Flag löschen, um zu verhindern, dass das Kombinationsfeld neu gezeichnet wird, nachdem jedes Element hinzugefügt wurde. Weitere Informationen zur Neuzeichnung finden Sie in der Beschreibung der WM _ SETREDRAW-Meldung.
Um die einem Listenelement zugeordnete Zeichenfolge abzurufen, kann eine Anwendung die CB _ GETLBTEXT-Nachricht verwenden. Die Zeichenfolge des Elements wird in den von der Anwendung angegebenen Puffer kopiert. Um sicherzustellen, dass der Puffer groß genug ist, um die Zeichenfolge zu empfangen, kann die Anwendung zuerst die CB _ GETLBTEXTLEN-Nachricht verwenden, um die Länge der Zeichenfolge zu bestimmen. Um die Anzahl der Listenelemente in einem Kombinationsfeld zu erhalten, kann eine Anwendung die CB _ GETCOUNT-Nachricht verwenden.
Bearbeiten von Steuerelementauswahlfeldern
Eine Anwendung kann den Inhalt des Auswahlfelds abrufen oder festlegen und die Bearbeitungsauswahl bestimmen oder festlegen. Die Anwendung kann auch die Textmenge einschränken, die ein Benutzer in das Auswahlfeld eingeben kann. Wenn sich der Inhalt des Auswahlfelds ändert, sendet das System Benachrichtigungsmeldungen an das übergeordnete Fenster oder die Dialogfeldprozedur.
Um den Inhalt des Auswahlfelds abzurufen, kann eine Anwendung die WM _ GETTEXT-Nachricht an das Kombinationsfeld senden. Um den Inhalt des Auswahlfelds eines einfachen Oder-Dropdown-Kombinationsfelds zu setzen, kann eine Anwendung die WM _ SETTEXT-Nachricht an das Kombinationsfeld senden.
Die Bearbeitungsauswahl ist der Bereich des ausgewählten Texts im Auswahlfeld eines einfachen kombinationsfelds oder dropdownbasierten Kombinationsfelds, sofern dieser enthalten ist. Eine Anwendung kann die Anfangs- und Endzeichenpositionen der aktuellen Auswahl mithilfe der CB _ GETEDITSEL-Nachricht bestimmen. Es kann auch Zeichen in der Bearbeitungsauswahl auswählen, indem die CB _ SETEDITSEL-Nachricht verwendet wird.
Anfänglich wird die Textmenge, die der Benutzer in das Auswahlfeld eingeben kann, durch die Größe des Auswahlfelds beschränkt. Wenn das Kombinationsfeld jedoch über den CBS _ AUTOHSCROLL-Stil verfügt, kann der Text über die Größe des Auswahlfelds hinaus fortgesetzt werden. Eine Anwendung kann die CB _ LIMITTEXT-Nachricht verwenden, um die Textmenge zu begrenzen, die ein Benutzer in das Auswahlfeld eingeben kann, unabhängig davon, ob das Steuerelement über das CBS _ AUTOHSCROLL-Format verfügt.
Wenn der Benutzer den Inhalt des Auswahlfelds bearbeitet, empfängt das übergeordnete Fenster oder die Dialogfeldprozedur Benachrichtigungsmeldungen. Zuerst wird der _ CBN EDITUPDATE-Benachrichtigungscode gesendet, der angibt, dass der Text im Auswahlfeld bearbeitet wurde. Nachdem der geänderte Text angezeigt wurde, sendet das System CBN _ EDITCHANGE. Wenn sich der Inhalt des Auswahlfelds als Ergebnis der Auswahl eines Listenelements ändert, werden diese Meldungen nicht gesendet.
Owner-Drawn Kombinationsfelder
Eine Anwendung kann ein vom Besitzer gezeichnetes Kombinationsfeld erstellen, um die Verantwortung für das Malen von Listenelementen zu übernehmen. Das übergeordnete Fenster eines vom Besitzer gezeichneten Kombinationsfelds (dessen Besitzer) empfängt WM _ DRAWITEM-Meldungen, wenn ein Teil des Kombinationsfelds gezeichnet werden muss. Ein vom Besitzer gezeichnetes Kombinationsfeld kann andere Informationen als Oder zusätzlich zu Textzeichenfolgen auflisten. Vom Besitzer gezeichnete Kombinationsfelder können einen beliebigen Typ haben. Das Bearbeitungssteuerfeld in einem einfachen Oder-Dropdown-Kombinationsfeld kann jedoch nur Text anzeigen, während der Besitzer das Auswahlfeld in ein Dropdownlistenfeld zeichnet.
Der Besitzer eines vom Besitzer gezeichneten Kombinationsfelds muss die WM _ DRAWITEM-Nachricht verarbeiten. Diese Meldung wird immer dann gesendet, wenn ein Teil des Kombinationsfelds neu gezeichnet werden muss. Je nach den für das Kombinationsfeld angegebenen Formatvorlagen muss der Besitzer möglicherweise andere Nachrichten verarbeiten.
Eine Anwendung kann ein vom Besitzer gezeichnetes Kombinationsfeld erstellen, indem der CBS _ OWNERDRAWFIXED- oder CBS _ OWNERDRAWVARIABLE-Stil angegeben wird. Wenn alle Listenelemente im Kombinationsfeld dieselbe Höhe haben, z. B. Zeichenfolgen oder Symbole, kann eine Anwendung den CBS _ OWNERDRAWFIXED-Stil verwenden. Wenn Listenelemente unterschiedliche Höhe haben, z. B. Bitmaps unterschiedlicher Größe, kann eine Anwendung den CBS _ OWNERDRAWVARIABLE-Stil verwenden.
Der Besitzer eines vom Besitzer gezeichneten Kombinationsfelds kann eine WM _ MEASUREITEM-Nachricht verarbeiten, um die Dimensionen von Listenelementen im Kombinationsfeld anzugeben. Wenn die Anwendung das Kombinationsfeld mithilfe des CBS _ OWNERDRAWFIXED-Stils erstellt, sendet das System die WM _ MEASUREITEM-Nachricht nur einmal. Die vom Besitzer angegebenen Dimensionen werden für alle Listenelemente verwendet. Wenn der CBS _ OWNERDRAWVARIABLE-Stil verwendet wird, sendet das System eine WM _ MEASUREITEM-Nachricht für jedes Listenelement, das dem Kombinationsfeld hinzugefügt wird. Der Besitzer kann die Höhe eines Listenelements jederzeit mithilfe der CB _ GETITEMHEIGHT- bzw. CB _ SETITEMHEIGHT-Meldungen bestimmen oder festlegen.
Wenn die in einem vom Besitzer gezeichneten Kombinationsfeld angezeigten Informationen Text enthalten, kann eine Anwendung den Text für jedes Listenelement nachverfolgen, indem der CBS _ HASSTRINGS-Stil angegeben wird. Kombinationsfelder mit dem CBS _ SORT-Stil werden basierend auf diesem Text sortiert. Wenn ein Kombinationsfeld sortiert ist und nicht das CBS _ HASSTRINGS-Format auft, muss der Besitzer die WM _ COMPAREITEM-Nachricht verarbeiten.
In einem vom Besitzer gezeichneten Kombinationsfeld muss der Besitzer Listenelemente nachverfolgen, die andere Informationen als oder zusätzlich zu Text enthalten. Eine praktische Möglichkeit hierzu ist das Speichern des Handles in den Informationen als Elementdaten. Um Datenobjekte frei zu geben, die Elementen in einem Kombinationsfeld zugeordnet sind, kann der Besitzer die WM _ DELETEITEM-Nachricht verarbeiten.
Kombinationsfelder mit Unterklassen
Unterklassen sind eine Prozedur, mit der eine Anwendung gesendete oder in einem Fenster gesendete Nachrichten abfangen und verarbeiten kann. Durch die Verwendung von Unterklassen kann eine Anwendung bestimmte Nachrichten durch ihre eigene Verarbeitung ersetzen, während die meisten Nachrichtenverarbeitungen der klassendefinierten Fensterprozedur überlässt.
Wenn das Betriebssystem ein Fenster erstellt, speichert es Informationen darüber in einer internen Datenstruktur, die einen Zeiger auf die Fensterprozedur enthält. Um eine Unterklasse eines Fensters zu erstellen, ruft eine Anwendung die SetClassLong-Funktion auf, um den Zeiger auf diese Prozedur durch einen Zeiger auf eine anwendungsdefinierte Unterklassenprozedur zu ersetzen. Danach werden alle Meldungen an das Fenster an die Unterklassenprozedur gesendet. In dieser Prozedur wird dann die CallWindowProc-Funktion verwendet, um nicht verarbeitete Nachrichten an die ursprüngliche Fensterprozedur zu übergeben. Eine Beschreibung der Nachrichtenverarbeitung, die von der ComboBOX-Klassenfensterprozedur ausgeführt wird, finden Sie unter Standardverhalten für Kombinationsboxen.
Wenn sich das Kombinationsfeld außerhalb eines Dialogfelds befindet, kann eine Anwendung die TAB-, EINGABE- und ESC-Schlüssel nur verarbeiten, wenn sie eine Unterklassenprozedur verwendet. Wenn ein einfaches Oder-Dropdown-Kombinationsfeld den Eingabefokus erhält, wird der Fokus sofort auf das untergeordnete Bearbeitungssteuerfeld festgelegt. Daher muss eine Anwendung eine Unterklasse des Bearbeitungssteuerfelds erstellen, um Tastatureingaben für ein einfaches Oder-Dropdown-Kombinationsfeld abzufangen. Ein Beispiel hierfür finden Sie unter Unterklassen eines Kombinationsfelds.
Wenn eine Unterklassenprozedur die WM _ PAINT-Nachricht verarbeitet, muss sie die BeginPaint-Funktion verwenden, um sich auf das Zeichnen vorzubereiten. Vor dem Aufrufen der EndPaint-Funktion übergibt sie das Dc-Handle (Device Context) als wParam-Parameter für die Fensterprozedur. Wenn EndPaint zuerst aufgerufen wird, wird die Prozedur für das Klassenfenster nicht gestrichen, da EndPaint das gesamte Fenster überprüft.
Eine Technik, die sich auf das Unterklassening bezieht, ist das Übergeordnete. Eine Übergeordnete Klasse ähnelt jeder anderen Klasse, außer dass ihre Fensterprozedur DefWindowProc nicht aufruft, um nicht verarbeitete Nachrichten zu verarbeiten. Stattdessen werden nicht verarbeitete Nachrichten an die Fensterprozedur für die übergeordnete Fensterklasse übergibt. Befolgen Sie die Richtlinien unter Fensterverfahren, um Probleme zu vermeiden, die bei unter- und übergeordneten Klasse auftreten können.