Informationen zu Kombinationsfeldern
Ein Kombinationsfeld kombiniert ein Bearbeitungsfeld oder statischen Text mit einer Liste.
Dieses Thema enthält folgende Abschnitte:
- Kombinationsfeldtypen und -stile
- Kombinationsfeldliste
- Bearbeiten von Steuerelementauswahlfeldern
- Vom Besitzer gezeichnete Kombinationsfelder
- Unterklassierte Kombinationsfelder
Kombinationsfeldtypen und -stile
Ein Kombinationsfeld besteht aus einer Liste und einem Auswahlfeld. Die Liste enthält die Optionen, die ein Benutzer auswählen kann, und das Auswahlfeld zeigt die aktuelle Auswahl an. 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 allgemeine Steuerelementbibliothek enthält drei Standard Stile 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_DROPDOWN | Zeigt die Liste an, wenn auf das Symbol geklickt wird, und zeigt das ausgewählte Element in einem Bearbeitungssteuerelement an. |
Dropdownliste (Dropdownliste) | CBS_DROPDOWNLIST | 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 Kombinationsfelden, 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 Liste wurde im Microsoft Visual Studio-Ressourcen-Editor angepasst und ist nur groß genug, um zwei Elemente aufzunehmen.
Im zweiten Screenshot hat der Benutzer im Bearbeitungssteuerelement des Dropdownkombinationsfelds neuen Text 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 Dropdownlistenkombinationsfeld 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 Kombinationsfeldformatvorlagen finden Sie unter Kombinationsfeldstile.
Hinweis
Um visuelle Stile mit Kombinationsfeldern verwenden zu können, muss eine Anwendung ein Manifest enthalten und am Anfang des Programms InitCommonControls aufrufen. Informationen zu visuellen Stilen finden Sie unter Visuelle Stile. Informationen zu Manifesten finden Sie unter Aktivieren von visuellen Formatvorlagen.
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 Dropdownkombinationsfeldern 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, falls dies erforderlich ist.
In diesem Abschnitt werden die folgenden Themen behandelt:
Aktuelle Auswahl
Die aktuelle Auswahl ist ein Listenelement, das der Benutzer ausgewählt hat. Der markierte 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 erhält 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 oder Dropdown-Kombinationsfeld, wenn der Benutzer den Inhalt des Auswahlfelds bearbeitet hat. Um die aktuelle Auswahl festzulegen, sendet eine Anwendung die CB_SETCURSEL Meldung an das Kombinationsfeld. Eine Anwendung kann auch die CB_SELECTSTRING Meldung 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 Meldung 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 Nachricht mit dem CBN_SELCHANGE Benachrichtigungscode im Wort in hoher Reihenfolge des wParam-Parameters . Dieser Benachrichtigungscode wird nicht gesendet, wenn die aktuelle Auswahl mithilfe der CB_SETCURSEL Nachricht festgelegt wird.
Ein Dropdown-Kombinationsfeld oder Dropdownlistenfeld 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 bei jeder Auswahl eines Listenelements durch den Benutzer 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 CBN_SELENDOK und CBN_SELENDCANCEL Benachrichtigungscodes 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 dass 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 doppelklicken. In einem Dropdown-Kombinationsfeld oder einer Dropdownliste blendet ein einzelner Klick die Liste aus, sodass es nicht möglich ist, auf ein Element zu doppelklicken.
Dropdownlisten
Bestimmte Benachrichtigungen und Meldungen gelten nur für Kombinationsfelder, die Dropdownlisten enthalten. Wenn eine Dropdownliste geöffnet oder geschlossen ist, erhält das übergeordnete Fenster eines Kombinationsfelds eine Benachrichtigung in Form einer WM_COMMAND Nachricht. Wenn die Liste geöffnet wird, wird das Wort mit hoher Reihenfolge von wParamCBN_DROPDOWN. Wenn die Liste geschlossen wird, ist sie CBN_CLOSEUP.
Eine Anwendung kann die Liste eines Dropdown-Kombinationsfelds oder Dropdownlistenfelds mithilfe der CB_SHOWDROPDOWN-Meldung öffnen. Es kann mithilfe der CB_GETDROPPEDSTATE Nachricht bestimmen, 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 Meldung erhöhen.
Inhalt auflisten
Wenn eine Anwendung ein Kombinationsfeld erstellt, initialisiert sie in der Regel das Kombinationsfeld, indem sie der Liste ein oder mehrere Elemente hinzufügt. Später kann eine Anwendung Listenelemente hinzufügen oder löschen, die Liste neu initialisieren oder Elementinformationen daraus abrufen.
Eine Anwendung fügt listenelemente zu einem Kombinationsfeld hinzu, indem sie die CB_ADDSTRING Nachricht an sie sendet. Das angegebene Element wird am Ende der Liste oder in einem sortierten Kombinationsfeld an seiner korrekt sortierten Position basierend auf der Zeichenfolge des Elements hinzugefügt. In einem unsortierten Kombinationsfeld kann eine Anwendung die CB_INSERTSTRING Nachricht verwenden, um ein Element an einer bestimmten Position einzufügen. Nach dem Hinzufügen wird ein Listenelement durch seine Position identifiziert.
Mithilfe der CB_FINDSTRING oder CB_FINDSTRINGEXACT Nachricht kann eine Anwendung die Position eines Listenelements bestimmen. CB_FINDSTRING findet ein Element, dessen Zeichenfolge mit der angegebenen Zeichenfolge beginnt. CB_FINDSTRINGEXACT findet ein Element, dessen Zeichenfolge genau mit der Zeichenfolge übereinstimmt. Bei keiner Nachricht wird die Groß-/Kleinschreibung beachtet.
Eine Anwendung kann ein Listenelement mithilfe der CB_DELETESTRING-Nachricht entfernen. Wenn eine Anwendung die Kombinationsfeldliste neu initialisieren muss, kann sie zunächst den gesamten Inhalt mithilfe der CB_RESETCONTENT Nachricht löschen. Wenn der Liste mehrere Elemente hinzugefügt werden, nachdem bereits ein Kombinationsfeld angezeigt wurde, kann eine Anwendung das Redraw-Flag löschen, um zu verhindern, dass das Kombinationsfeld nach dem Hinzufügen jedes Elements neu gestrichen wird. Weitere Informationen zum Neuzeichnen 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 abzurufen, kann eine Anwendung die CB_GETCOUNT Nachricht verwenden.
Steuerelementauswahlfelder bearbeiten
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 Benachrichtigungen 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 Kombinationsfelds oder eines Dropdown-Kombinationsfelds festzulegen, kann eine Anwendung die WM_SETTEXT Nachricht an das Kombinationsfeld senden.
Die Bearbeitungsauswahl ist der Bereich des markierten Texts(sofern vorhanden) im Auswahlfeld eines einfachen Kombinationsfelds oder eines Dropdown-Kombinationsfelds. Eine Anwendung kann die Anfangs- und Endzeichenposition der aktuellen Auswahl mithilfe der CB_GETEDITSEL-Nachricht bestimmen. Es kann auch Zeichen in der Bearbeitungsauswahl mithilfe der CB_SETEDITSEL Nachricht auswählen.
Zunächst wird die Textmenge, die der Benutzer in das Auswahlfeld eingeben kann, durch die Größe des Auswahlfelds begrenzt. Wenn das Kombinationsfeld jedoch das CBS_AUTOHSCROLL Format aufweist, 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 die CBS_AUTOHSCROLL Format aufweist.
Wenn der Benutzer den Inhalt des Auswahlfelds bearbeitet, empfängt das übergeordnete Fenster oder die Dialogfeldprozedur Benachrichtigungen. Der CBN_EDITUPDATE Benachrichtigungscode wird zuerst gesendet, was 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 aufgrund der Auswahl eines Listenelements ändert, werden diese Nachrichten nicht gesendet.
Owner-Drawn Kombinationsfelde
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 Nachrichten, 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 aufweisen. Das Bearbeitungssteuerelement in einem einfachen Kombinationsfeld oder einem Dropdown-Kombinationsfeld kann jedoch nur Text anzeigen, während der Besitzer das Auswahlfeld in einem Dropdownlistenfeld malt.
Der Besitzer eines vom Besitzer gezeichneten Kombinationsfelds muss die WM_DRAWITEM Nachricht verarbeiten. Diese Nachricht wird gesendet, wenn ein Teil des Kombinationsfelds neu gezeichnet werden muss. Der Besitzer muss möglicherweise andere Nachrichten verarbeiten, abhängig von den Formaten, die für das Kombinationsfeld angegeben sind.
Eine Anwendung kann ein vom Besitzer gezeichnetes Kombinationsfeld erstellen, indem sie das CBS_OWNERDRAWFIXED - oder CBS_OWNERDRAWVARIABLE-Format angibt. Wenn alle Listenelemente im Kombinationsfeld die gleiche Höhe aufweisen, z. B. Zeichenfolgen oder Symbole, kann eine Anwendung die CBS_OWNERDRAWFIXED Formatvorlage verwenden. Wenn Listenelemente eine unterschiedliche Höhe aufweisen, 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 im CBS_OWNERDRAWFIXED-Format erstellt, sendet das System die WM_MEASUREITEM Nachricht nur einmal. Die vom Besitzer angegebenen Dimensionen werden für alle Listenelemente verwendet. Wenn die 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 Nachrichten 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 sie die CBS_HASSTRINGS Formatvorlage angibt. Kombinationsfelder mit dem CBS_SORT Stil werden basierend auf diesem Text sortiert. Wenn ein Kombinationsfeld sortiert ist und nicht der CBS_HASSTRINGS-Format entspricht, 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 ist das Speichern des Handles in den Informationen als Elementdaten. Um Datenobjekte freizugeben, die Elementen in einem Kombinationsfeld zugeordnet sind, kann der Besitzer die WM_DELETEITEM Nachricht verarbeiten.
Unterklassierte Kombinationsfelde
Die Unterklassifizierung ist eine Prozedur, mit der eine Anwendung Nachrichten abfangen und verarbeiten kann, die an ein Fenster gesendet oder gesendet werden. Durch die Verwendung von Unterklassen kann eine Anwendung ihre eigene Verarbeitung für bestimmte Nachrichten ersetzen, während die meiste Nachrichtenverarbeitung der klassendefinierte Fensterprozedur überlassen wird.
Wenn das Betriebssystem ein Fenster erstellt, speichert es Informationen dazu in einer internen Datenstruktur, die einen Zeiger auf die Fensterprozedur enthält. Zum Unterklassen eines Fensters 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 Nachrichten an das Fenster an die Unterklassenprozedur gesendet. Diese Prozedur verwendet dann die CallWindowProc-Funktion , um unverarbeitete Nachrichten an die ursprüngliche Fensterprozedur zu übergeben. Eine Beschreibung der Nachrichtenverarbeitung, die von der COMBOBOX-Klassenfensterprozedur ausgeführt wird, finden Sie unter Standardverhalten von Kombinationsfelden.
Wenn sich das Kombinationsfeld außerhalb eines Dialogfelds befindet, kann eine Anwendung die TAB-, EINGABETASTE- und ESC-Schlüssel nur verarbeiten, wenn sie eine Unterklassenprozedur verwendet. Wenn ein einfaches Kombinationsfeld oder ein Dropdown-Kombinationsfeld den Eingabefokus empfängt, legt es sofort den Fokus auf das untergeordnete Bearbeitungssteuerelement fest. Daher muss eine Anwendung das Bearbeitungssteuerelement unterklassig machen, um Tastatureingaben für ein einfaches Kombinationsfeld oder ein Dropdown-Kombinationsfeld abzufangen. Ein Beispiel hierfür finden Sie unter Unterklassifizierung eines Kombinationsfelds.
Wenn eine Unterklassenprozedur die WM_PAINT Nachricht verarbeitet, muss sie die BeginPaint-Funktion verwenden, um sich auf das Malen 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 von der Klassenfensterprozedur keine Zeichnung ausgeführt, da EndPaint das gesamte Fenster überprüft.
Eine Technik im Zusammenhang mit Unterklassen ist die Superklassifizierung. Eine Superklasse ähnelt jeder anderen Klasse, mit der Ausnahme, dass ihre Fensterprozedur defWindowProc nicht aufruft, um nicht verarbeitete Nachrichten zu behandeln. Stattdessen werden unverarbeitete Nachrichten an die Fensterprozedur für die übergeordnete Fensterklasse übergeben. Befolgen Sie die Richtlinien unter Fensterprozeduren , um Probleme zu vermeiden, die bei Unter- und Oberklassen auftreten können.