Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een combobox combineert een invoervak of vaststaande tekst en een lijst.
Dit onderwerp bevat de volgende secties.
- Combo Box-typen en -stijlen
- Combo Box-lijst
- Bewerken van selectievelden voor besturingselementen
- Owner-Drawn keuzelijsten
- Subklasse comboboxen
Typen en stijlen voor keuzelijsten met invoervak
Een keuzelijst bestaat uit een lijst en een selectieveld. De lijst bevat de opties die een gebruiker kan selecteren en het selectieveld geeft de huidige selectie weer. Als het selectieveld een besturingselement voor bewerken is, kan de gebruiker gegevens invoeren die niet beschikbaar zijn in de lijst; anders kan de gebruiker alleen items in de lijst selecteren.
De standaardbibliotheek voor besturingselementen bevat drie hoofdstijlen van keuzelijsten, zoals weergegeven in de volgende tabel.
| Type keuzelijst met invoervak | Stijlconstante | Beschrijving |
|---|---|---|
| Eenvoudig | CBS_SIMPLE | Geeft de lijst altijd weer en toont het geselecteerde item in een bewerkingsveld. |
| Vervolgkeuzelijst | CBS_DROPDOWN | Geeft de lijst weer wanneer op het pictogram wordt geklikt en toont het geselecteerde item in een bewerkingsveld. |
| Vervolgkeuzelijst | CBS_DROPDOWNLIST | Geeft de lijst weer wanneer op het pictogram wordt geklikt en toont het geselecteerde item in een statisch besturingselement. |
In de volgende schermafbeeldingen worden de drie soorten keuzelijst met invoervak weergegeven, zoals deze kunnen worden weergegeven in Windows Vista. In de eerste schermafbeelding heeft de gebruiker een item geselecteerd in de eenvoudige keuzelijst. De gebruiker kan ook een nieuwe waarde typen in het invoervak van dit besturingselement. De lijst is aangepast in de Microsoft Visual Studio-resource-editor en is slechts groot genoeg voor twee items.
In de tweede schermafbeelding heeft de gebruiker nieuwe tekst getypt in het bewerkingsveld van de vervolgkeuzelijst. De gebruiker kan ook een bestaand item hebben geselecteerd. Het lijstvak wordt uitgevouwen om zoveel mogelijk items weer te geven.
In de derde schermafbeelding heeft de gebruiker de keuzelijst met invoervak geopend. Het lijstvak wordt uitgevouwen om zoveel mogelijk items op te nemen. De gebruiker kan geen nieuwe tekst invoeren.
Er zijn ook een aantal stijlen voor keuzelijsten waarmee specifieke eigenschappen worden gedefinieerd. Met comboboxstijlen worden specifieke eigenschappen van een keuzelijst gedefinieerd. U kunt stijlen combineren; Sommige stijlen zijn echter alleen van toepassing op bepaalde typen keuzelijsten met invoervak. Zie Stijlen voor keuzelijst met invoervakvoor een tabel met keuzelijsten met invoervak.
Notitie
Om visuele stijlen met keuzelijsten te gebruiken, moet een toepassing een manifest bevatten en moet InitCommonControls aan het begin van het programma worden aangeroepen. Zie Visuele stijlenvoor meer informatie over visuele stijlen. Zie Visuele stijlen inschakelenvoor meer informatie over manifesten.
Keuzelijst met invoervak
De lijst is het gedeelte van een keuzelijst waarin de items worden weergegeven die een gebruiker kan selecteren. Normaal gesproken initialiseert een toepassing de inhoud van de lijst wanneer een combobox wordt gemaakt. Een lijstitem dat door de gebruiker is geselecteerd, is de huidige selectie. Er kunnen niet meerdere items worden geselecteerd. In eenvoudige keuzelijsten en vervolgkeuzelijsten kan de gebruiker in het selectieveld typen in plaats van een lijstitem te selecteren. In deze gevallen is er geen huidige selectie en is het de verantwoordelijkheid van de toepassing om het item toe te voegen aan de lijst en deze de huidige selectie te maken, als dit nodig is.
In deze sectie worden de volgende onderwerpen besproken:
Huidige selectie
De huidige selectie is een lijstitem dat de gebruiker heeft geselecteerd; de geselecteerde tekst wordt weergegeven in het selectieveld van de keuzelijst. In het geval van een eenvoudige keuzelijst met invoervak of een vervolgkeuzelijst is de huidige selectie echter slechts één vorm van mogelijke gebruikersinvoer in een keuzelijst met invoervak. De gebruiker kan ook tekst typen in het selectieveld.
De huidige selectie wordt geïdentificeerd door de op nul gebaseerde index van het geselecteerde lijstitem. Een toepassing kan deze op elk gewenst moment instellen en ophalen. De procedure voor het oudervenster of dialoogvenster ontvangt een melding wanneer de gebruiker de huidige selectie voor een keuzelijst wijzigt. Het oudervenster of dialoogvenster wordt niet gewaarschuwd wanneer de toepassing de selectie wijzigt.
Wanneer er een keuzelijst met invoervak wordt gemaakt, is er geen geselecteerde optie. Dit geldt ook voor een eenvoudige combobox of uitklapbare combobox, als de gebruiker de inhoud van het selectieveld heeft bewerkt. Om de huidige selectie in te stellen, verzendt een toepassing het CB_SETCURSEL bericht naar de keuzelijst. Een toepassing kan ook het CB_SELECTSTRING bericht gebruiken om de huidige selectie in te stellen op een lijstitem waarvan de tekenreeks begint met een opgegeven tekenreeks. Om de huidige selectie te bepalen, verzendt een toepassing het CB_GETCURSEL bericht naar de keuzelijst. Als er geen huidige selectie is, retourneert dit bericht CB_ERR.
Wanneer de gebruiker de huidige selectie in een combobox wijzigt, ontvangt de procedure voor het bovenliggende venster of dialoogvenster een WM_COMMAND bericht met de meldingscode CBN_SELCHANGE in het hoogwaardig woord van de parameter wParam. Deze meldingscode wordt niet verzonden wanneer de huidige selectie is ingesteld met behulp van het CB_SETCURSEL bericht.
Een combobox of vervolgkeuzelijst verzendt de CBN_CLOSEUP meldingscode naar het bovenliggende venster of dialoogvenster wanneer de vervolgkeuzelijst wordt gesloten. Als de gebruiker de huidige selectie heeft gewijzigd, verzendt de keuzelijst met invoervak ook de CBN_SELCHANGE meldingscode wanneer de vervolgkeuzelijst wordt gesloten. Als u een specifiek proces wilt uitvoeren telkens wanneer de gebruiker een lijstitem selecteert, kunt u de CBN_SELCHANGE of CBN_CLOSEUP meldingscode afhandelen. Normaal gesproken wacht u op de CBN_CLOSEUP meldingscode voordat u een wijziging in de huidige selectie verwerkt. Dit kan met name belangrijk zijn als een aanzienlijke hoeveelheid verwerking vereist is.
Een toepassing kan ook de CBN_SELENDOK en CBN_SELENDCANCEL meldingscodes verwerken. Het systeem verzendt CBN_SELENDOK wanneer de gebruiker een lijstitem selecteert of een item selecteert en vervolgens de lijst sluit. Dit geeft aan dat de gebruiker klaar is en dat de selectie moet worden verwerkt. CBN_SELENDCANCEL wordt verstuurd wanneer de gebruiker een item selecteert, maar vervolgens een ander besturingselement selecteert, of drukt op Esc terwijl de vervolgkeuzelijst is geopend, of sluit het dialoogvenster. Dit geeft aan dat de selectie van de gebruiker moet worden genegeerd. CBN_SELENDOK wordt verzonden vóór elk CBN_SELCHANGE-bericht.
In een eenvoudige keuzelijst met invoervak verzendt het systeem de CBN_DBLCLK meldingscode wanneer de gebruiker dubbelklikt op een lijstitem. In een vervolgkeuzemenu of keuzelijst verbergt een enkele klik de lijst, zodat het niet mogelijk is om dubbel te klikken op een item.
Vervolgkeuzelijsten
Bepaalde meldingen en berichten zijn alleen van toepassing op keuzelijsten met vervolgkeuzemenu's. Wanneer een dropdownlijst is geopend of gesloten, ontvangt het bovenliggende venster van een combobox een melding in de vorm van een WM_COMMAND bericht. Als de lijst aan het openen is, is het hoogst gelegen woord van wParamCBN_DROPDOWN. Als de lijst wordt gesloten, wordt deze CBN_CLOSEUP.
Een toepassing kan de lijst van een vervolgkeuzemenu of vervolgkeuzelijst openen met behulp van het CB_SHOWDROPDOWN bericht. Het kan bepalen of de lijst is geopend met behulp van het CB_GETDROPPEDSTATE bericht en kan de coördinaten van een vervolgkeuzelijst bepalen met behulp van het CB_GETDROPPEDCONTROLRECT bericht. Een toepassing kan ook de breedte van een vervolgkeuzelijst vergroten met behulp van het CB_SETDROPPEDWIDTH bericht.
Inhoud van lijst
Wanneer een toepassing een keuzelijst met invoervak maakt, wordt de keuzelijst met invoervak meestal geïnitialiseerd door een of meer items toe te voegen aan de lijst. Later kan een toepassing lijstitems toevoegen of verwijderen, de lijst opnieuw initialiseren of itemgegevens ervan ophalen.
Een toepassing voegt lijstitems toe aan een combobox door het CB_ADDSTRING bericht ernaar te verzenden. Het opgegeven item wordt toegevoegd aan het einde van de lijst of, in een gesorteerde keuzelijst, op de juiste gesorteerde positie op basis van de tekenreeks van het item. In een niet-gesorteerde keuzelijst kan een toepassing het CB_INSERTSTRING bericht gebruiken om een item op een specifieke positie in te voegen. Zodra dit is toegevoegd, wordt een lijstitem geïdentificeerd op basis van de positie.
Met behulp van het CB_FINDSTRING of CB_FINDSTRINGEXACT bericht kan een toepassing de positie van een lijstitem bepalen. CB_FINDSTRING zoekt een item waarvan de tekenreeks begint met de opgegeven tekenreeks. CB_FINDSTRINGEXACT zoekt een item waarvan de tekenreeks exact overeenkomt met de tekenreeks. Geen van beide berichten is hoofdlettergevoelig.
Een toepassing kan een lijstitem verwijderen met behulp van het CB_DELETESTRING bericht. Als een toepassing de keuzelijst met invoervak opnieuw moet initialiseren, kan deze eerst de volledige inhoud wissen met behulp van het CB_RESETCONTENT bericht. Wanneer u meerdere items aan de lijst toevoegt nadat er al een keuzelijst met invoervak is weergegeven, kan een toepassing de vlag voor opnieuw tekenen wissen om te voorkomen dat de keuzelijst met invoervak opnieuw wordt geschilderd nadat elk item is toegevoegd. Zie de beschrijving van het WM_SETREDRAW bericht voor meer informatie over het opnieuw tekenen.
Een toepassing kan het CB_GETLBTEXT bericht gebruiken om de tekenreeks op te halen die is gekoppeld aan een lijstitem. De tekenreeks van het item wordt gekopieerd naar de buffer die is opgegeven door de toepassing. Om ervoor te zorgen dat de buffer groot genoeg is om de tekenreeks te ontvangen, kan de toepassing eerst het CB_GETLBTEXTLEN bericht gebruiken om de lengte van de tekenreeks te bepalen. Een toepassing kan het CB_GETCOUNT bericht gebruiken om het aantal items in een keuzelijst of combobox op te halen.
Bewerk keuzevelden voor bedieningselementen
Een toepassing kan de inhoud van het selectieveld ophalen of instellen en de bewerkingsselectie bepalen of instellen. De toepassing kan ook de hoeveelheid tekst beperken die een gebruiker kan typen in het selectieveld. Wanneer de inhoud van het selectieveld verandert, stuurt het systeem meldingsberichten naar de bovenliggende venster- of dialoogvensterprocedure.
Als een toepassing de inhoud van het selectieveld wil ophalen, kan deze het WM_GETTEXT bericht naar de combobox verzenden. Als u de inhoud van het selectieveld van een eenvoudige of vervolgkeuzelijst wilt instellen, kan een toepassing het WM_SETTEXT signaal naar de keuzelijst verzenden.
De bewerkingsselectie is het bereik van de geselecteerde tekst, indien aanwezig, in het selectieveld van een eenvoudige of vervolgkeuzelijst. Een toepassing kan de positie van het begin- en eindteken van de huidige selectie bepalen met behulp van het CB_GETEDITSEL bericht. U kunt ook tekens in de bewerkingsselectie selecteren met behulp van het CB_SETEDITSEL bericht.
In eerste instantie wordt de hoeveelheid tekst die de gebruiker in het selectieveld kan typen, beperkt door de grootte van het selectieveld. Als de keuzelijst echter de stijl CBS_AUTOHSCROLL heeft, kan de tekst verder gaan dan de grootte van het selectieveld. Een toepassing kan het CB_LIMITTEXT bericht gebruiken om de hoeveelheid tekst te beperken die een gebruiker in het selectieveld kan typen, ongeacht of het besturingselement de stijl CBS_AUTOHSCROLL heeft.
Wanneer de gebruiker de inhoud van het selectieveld bewerkt, ontvangt de procedure van het bovenliggende venster of dialoogvenster meldingsberichten. De CBN_EDITUPDATE meldingscode wordt eerst verzonden, waarmee wordt aangegeven dat de tekst in het selectieveld is bewerkt. Nadat de gewijzigde tekst is weergegeven, verzendt het systeem CBN_EDITCHANGE. Wanneer de inhoud van het selectieveld verandert als het resultaat van een geselecteerde lijstitem, worden deze berichten niet verzonden.
Owner-Drawn Comboboxen
Een toepassing kan een eigenhandig getekende combobox maken om verantwoordelijk te zijn voor het tekenen van lijstitems. Het bovenliggende venster van een door de eigenaar getekende combobox (de eigenaar) ontvangt WM_DRAWITEM berichten wanneer een deel van de combobox opnieuw moet worden getekend. Een door de eigenaar getekende keuzelijst met invoervak kan andere informatie bevatten dan of naast teksttekenreeksen. Eigen ontworpen keuzelijsten kunnen van elk type zijn. Het besturingselement bewerken in een eenvoudige keuzelijst met invoervak kan echter alleen tekst weergeven, terwijl de eigenaar het selectieveld in een vervolgkeuzelijst schildert.
De eigenaar van een eigenaar-gestuurde combobox moet het WM_DRAWITEM bericht verwerken. Dit bericht wordt verzonden wanneer een deel van de keuzelijst opnieuw moet worden getekend. De eigenaar moet mogelijk andere berichten verwerken, afhankelijk van de stijlen die zijn opgegeven voor de combobox.
Een applicatie kan een eigenaar-getekende keuzelijst maken door de stijl CBS_OWNERDRAWFIXED of CBS_OWNERDRAWVARIABLE op te geven. Als alle lijstitems in de keuzelijst dezelfde hoogte hebben, zoals tekenreeksen of pictogrammen, kan een applicatie de stijl CBS_OWNERDRAWFIXED gebruiken. Als lijstitems van verschillende hoogte zijn, zoals bitmaps van verschillende grootte, kan een toepassing de CBS_OWNERDRAWVARIABLE stijl gebruiken.
De eigenaar van een door de eigenaar getekende keuzelijst met invoervak kan een WM_MEASUREITEM bericht verwerken om de afmetingen van lijstitems in de keuzelijst met invoervak op te geven. Als de toepassing de keuzelijst maakt met behulp van de CBS_OWNERDRAWFIXED stijl, verzendt het systeem het WM_MEASUREITEM bericht slechts één keer. De dimensies die door de eigenaar zijn opgegeven, worden gebruikt voor alle lijstitems. Als de stijl CBS_OWNERDRAWVARIABLE wordt gebruikt, verzendt het systeem een WM_MEASUREITEM bericht voor elk lijstitem dat is toegevoegd aan de keuzelijst met invoervak. De eigenaar kan de hoogte van een lijstitem op elk gewenst moment bepalen of instellen door respectievelijk de CB_GETITEMHEIGHT en CB_SETITEMHEIGHT berichten te gebruiken.
Als de informatie die wordt weergegeven in een door de eigenaar getekende keuzelijst met invoervak tekst bevat, kan een toepassing de tekst voor elk lijstitem bijhouden door de stijl CBS_HASSTRINGS op te geven. Keuzelijsten met invoervak met de stijl CBS_SORT worden gesorteerd op basis van deze tekst. Als een keuzelijst met invoervak gesorteerd is en niet de stijl CBS_HASSTRINGS heeft, moet de eigenaar het bericht WM_COMPAREITEM verwerken.
In een door de eigenaar beheerde combo box moet de eigenaar lijstitems bijhouden die andere informatie bevatten dan of naast tekst. Een handige manier om dit te doen, is door het handvat op te slaan in de informatie als itemgegevens. Als de eigenaar gegevensobjecten die zijn gekoppeld aan items in een keuzelijst wil vrijmaken, kan hij het WM_DELETEITEM-bericht verwerken.
Gesubclassete keuzelijsten
Subklassen is een procedure waarmee een toepassing berichten kan onderscheppen en verwerken die naar een venster zijn verzonden of gepost. Door subklassen te gebruiken, kan een toepassing een eigen verwerking vervangen door bepaalde berichten, terwijl de meeste berichtverwerking wordt overgelaten aan de door de klasse gedefinieerde vensterprocedure.
Wanneer het besturingssysteem een venster maakt, wordt informatie over het venster opgeslagen in een interne gegevensstructuur met een aanwijzer naar de vensterprocedure. Als u een venster wilt subklassen, roept een toepassing de functie SetClassLong aan om de aanwijzer naar die procedure te vervangen door een aanwijzer naar een door de toepassing gedefinieerde subklasseprocedure. Daarna worden alle berichten naar het venster doorgezonden naar de subklasseprocedure. Deze procedure gebruikt vervolgens de functie CallWindowProc om niet-verwerkte berichten door te geven aan de oorspronkelijke vensterprocedure. Zie Standaardgedrag van combo-boxvoor een beschrijving van de berichtverwerking die wordt uitgevoerd door de classavenster-procedure.
Wanneer de keuzelijst zich buiten een dialoogvenster bevindt, kan een toepassing de toetsen TAB, ENTER en ESC niet verwerken, tenzij er een subclass-procedure wordt gebruikt. Wanneer een eenvoudige keuzelijst met invoervak de invoerfocus ontvangt, wordt de focus onmiddellijk ingesteld op het onderliggende bewerkingsbesturingselement. Daarom moet een toepassing het bewerkingscontrole-element subclassen om de invoer van het toetsenbord te onderscheppen voor een eenvoudige invoervak-keuzelijst of vervolgkeuzelijst. Zie Subklassen van een keuzelijst met invoervakvoor een voorbeeld hiervan.
Als een subklasseprocedure het WM_PAINT bericht verwerkt, moet deze de functie BeginPaint gebruiken om het schilderen voor te bereiden. Voordat u de functie EndPaint aanroept, wordt de apparaatcontextgreep (DC) doorgegeven als de parameter wParam voor de vensterprocedure. Als EndPaint als eerste wordt aangeroepen, voert de klassenvensterprocedure geen schilderactie uit omdat EndPaint het hele venster valideert.
Een techniek met betrekking tot subklassen is superklassen. Een superklasse lijkt op een andere klasse, behalve dat de vensterprocedure geen DefWindowProc- aanroept om niet-verwerkte berichten te verwerken. In plaats daarvan worden niet-verwerkte berichten doorgegeven aan de vensterprocedure voor de bovenliggende vensterklasse. Volg de richtlijnen in Vensterprocedures om problemen te voorkomen die kunnen optreden met subklassen en superklassen.