Delen via


Over lijstvakken

Een list box control bevat een eenvoudige lijst waaruit de gebruiker in het algemeen een of meer items kan selecteren. Keuzelijsten bieden beperkte flexibiliteit in vergelijking met lijstweergave besturingselementen.

Keuzelijstitems kunnen worden weergegeven door tekenreeksen, bitmaps of beide. Als de keuzelijst niet groot genoeg is om alle keuzelijstitems tegelijk weer te geven, bevat de keuzelijst een schuifbalk. De gebruiker bladert door de keuzelijstitems en past de selectiestatus toe of verwijdert indien nodig. Als u een keuzelijstitem selecteert, wordt het uiterlijk ervan gewijzigd, meestal door de tekst- en achtergrondkleuren te wijzigen in de kleuren die zijn opgegeven door de relevante metrische gegevens van het besturingssysteem. Wanneer de gebruiker een item selecteert of deselecteert, verzendt het systeem een meldingsbericht naar het bovenliggende venster van het lijstvak.

Voor een ANSI-toepassing converteert het systeem de tekst in een keuzelijst naar Unicode met behulp van de CP_ACP codepagina. Dit kan problemen veroorzaken. Geaccentueerde Romeinse tekens in een niet-Unicode-keuzelijst in Windows, Japanse versie, zullen bijvoorbeeld vervormd weergegeven worden. U kunt dit oplossen door de toepassing te compileren als Unicode of een door de eigenaar getekende keuzelijst te gebruiken.

In deze sectie worden de volgende onderwerpen besproken:

Een keuzelijst maken

De eenvoudigste manier om een keuzelijst in een dialoogvenster te maken, is door deze vanuit de werkset in Microsoft Visual Studio naar uw dialoogvensterresource te slepen. Als u dynamisch een lijstvak wilt maken of een lijstvak wilt maken in een ander venster dan een dialoogvenster, gebruikt u de functie CreateWindowEx en specificeert u de WC_LISTBOX vensterklasse en de juiste lijstvakstijlen.

Keuzelijsttypen en -stijlen

Er zijn twee typen keuzelijsten: één selectie (de standaardinstelling) en meerdere keuzemogelijkheden. In een keuzelijst kan de gebruiker slechts één element tegelijk selecteren. In een keuzelijst met meerdere keuzemogelijkheden kan de gebruiker meer dan één item tegelijk selecteren. Als u een keuzelijst met meerdere keuzemogelijkheden wilt maken, geeft u de LBS_MULTIPLESEL of de stijl LBS_EXTENDEDSEL op.

Het uiterlijk en de werking van een keuzelijst wordt bepaald door keuzelijststijlen en vensterstijlen. Deze stijlen geven aan of de lijst is gesorteerd, gerangschikt in meerdere kolommen, getekend door de toepassing, enzovoort. De dimensies en stijlen van een keuzelijst worden doorgaans gedefinieerd in een dialoogvenstersjabloon die is opgenomen in de resources van een toepassing.

Notitie

Als u visuele stijlen met deze besturingselementen wilt 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.

Keuzelijstfuncties

De functie DlgDirList vervangt de inhoud van een lijstvak door de namen van stations, mappen en bestanden die aan een bepaalde set criteria voldoen. De functie DlgDirSelectEx haalt de huidige selectie op in een keuzelijst die wordt geïnitialiseerd door DlgDirList. Met deze functies kan de gebruiker een station, map of bestand selecteren in een keuzelijst zonder de locatie en naam van het bestand te typen.

Bovendien retourneert de functie GetListBoxInfo het aantal items per kolom in een opgegeven keuzelijst.

Meldingsberichten uit lijstvakken

Wanneer een gebeurtenis optreedt in een keuzelijst, verzendt de keuzelijst een meldingscode, in de vorm van een WM_COMMAND bericht, naar de dialoogvensterprocedure van het eigenaarsvenster. Meldingscodes voor keuzelijsten worden verzonden wanneer een gebruiker een keuzelijstitem selecteert, dubbelklikt of annuleert; wanneer de keuzelijst de toetsenbordfocus ontvangt of verliest; en wanneer het systeem onvoldoende geheugen kan toewijzen voor een keuzelijstaanvraag. Een WM_COMMAND bericht bevat de lijstvak-ID in het laagwaardige woord van de wParam parameter en de meldingscode in het hoogwaardige woord. De parameter lParam bevat de besturingsvenstergreep.

Een dialoogvensterprocedure is niet vereist om deze berichten te verwerken; de standaardvensterprocedure verwerkt deze.

Een toepassing moet de volgende meldingscodes voor keuzelijsten bewaken en verwerken.

Meldingscode Beschrijving
LBN_DBLCLK De gebruiker dubbelklikt op een item in de keuzelijst.
LBN_ERRSPACE De keuzelijst kan onvoldoende geheugen toewijzen om aan een aanvraag te voldoen.
LBN_KILLFOCUS De keuzelijst verliest de focus van het toetsenbord.
LBN_SELCANCEL De gebruiker annuleert de selectie van een item in de keuzelijst.
LBN_SELCHANGE De selectie in een keuzelijst staat op het punt te veranderen.
LBN_SETFOCUS De keuzelijst krijgt de toetsenbordfocus.

Berichten naar lijstvakken

Een dialoogvensterprocedure kan berichten verzenden naar een keuzelijst om keuzelijstitems toe te voegen, te verwijderen, te onderzoeken en te wijzigen. Een dialoogvensterprocedure kan bijvoorbeeld een LB_ADDSTRING bericht verzenden naar een keuzelijst om een item toe te voegen en een LB_GETSEL bericht om te bepalen of het item is geselecteerd. Verdere berichten kunnen informatie instellen en opvragen met betrekking tot de grootte, het uiterlijk en het gedrag van het lijstvak. Met het LB_SETHORIZONTALEXTENT bericht wordt bijvoorbeeld de schuifbare breedte van een keuzelijst ingesteld. Een dialoogvensterprocedure kan elk bericht verzenden naar een keuzelijst met behulp van de functie SendMessage of SendDlgItemMessage.

Er wordt vaak naar een keuzelijstitem verwezen door de index, een geheel getal dat de positie van het item in de keuzelijst vertegenwoordigt. De index van het eerste item in een keuzelijst is 0, de index van het tweede item is 1, enzovoort.

In de volgende tabel wordt beschreven hoe de vooraf gedefinieerde keuzelijstprocedure reageert op berichten van keuzelijsten.

Bericht Antwoord
LB_ADDFILE Hiermee voegt u een bestand in een mappenlijst in die is ingevuld door de functie DlgDirList en wordt de keuzelijstindex van het ingevoegde item opgehaald.
LB_ADDSTRING Voegt een tekenreeks toe aan een lijstvak en retourneert de index.
LB_DELETESTRING Hiermee verwijdert u een tekenreeks uit een keuzelijst en wordt het aantal tekenreeksen geretourneerd dat in de lijst blijft staan.
LB_DIR Voegt een aantal bestandsnamen toe aan een lijstvak en retourneert de index van de laatste toegevoegde bestandsnaam.
LB_FINDSTRING Retourneert de index van de eerste tekenreeks in de keuzelijst die begint met een opgegeven tekenreeks.
LB_FINDSTRINGEXACT Retourneert de index van de tekenreeks in het lijstvak die gelijk is aan een opgegeven tekenreeks.
LB_GETANCHORINDEX Retourneert de index van het item dat de muis het laatst heeft geselecteerd.
LB_GETCARETINDEX Retourneert de index van het item met de focusrechthoek.
LB_GETCOUNT Retourneert het aantal items in de keuzelijst.
LB_GETCURSEL Retourneert de index van het geselecteerde item.
LB_GETHORIZONTALEXTENT Retourneert de schuifbare breedte, in pixels, van een keuzelijst.
LB_GETITEMDATA Retourneert de waarde die is gekoppeld aan het opgegeven item.
LB_GETITEMHEIGHT Retourneert de hoogte, in pixels, van een item in een keuzelijst.
LB_GETITEMRECT Haalt de clientcoördinaten van het opgegeven keuzelijstitem op.
LB_GETLOCALE Hiermee wordt de locale van de keuzelijst opgehaald. Het woord in hoge volgorde bevat de land-/regiocode en het woord met een lage volgorde bevat de taal-id.
LB_GETSEL Retourneert de selectiestatus van een keuzelijstitem.
LB_GETSELCOUNT Retourneert het aantal geselecteerde items in een keuzelijst met meerdere keuzemogelijkheden.
LB_GETSELITEMS Hiermee maakt u een matrix van de indexen van alle geselecteerde items in een keuzelijst met meerdere keuzemogelijkheden en wordt het totale aantal geselecteerde items geretourneerd.
LB_GETTEXT Haalt de tekenreeks op die is gekoppeld aan een opgegeven item en de lengte van de tekenreeks.
LB_GETTEXTLEN Retourneert de lengte, in tekens, van de tekenreeks die is gekoppeld aan een opgegeven item.
LB_GETTOPINDEX Retourneert de index van het eerste zichtbare item in een keuzelijst.
LB_INITSTORAGE Hiermee wijst u geheugen toe voor het opgegeven aantal items en de bijbehorende tekenreeksen.
LB_INSERTSTRING Hiermee voegt u een tekenreeks in bij een opgegeven index in een lijstvak.
LB_ITEMFROMPOINT Haalt de op nul gebaseerde index op van het item dat het dichtst bij het opgegeven punt in een keuzelijst staat.
LB_RESETCONTENT Hiermee verwijdert u alle items uit een keuzelijst.
LB_SELECTSTRING Selecteert de eerste tekenreeks die wordt gevonden die overeenkomt met een opgegeven voorvoegsel.
LB_SELITEMRANGE Hiermee selecteert u een opgegeven reeks items in een keuzelijst.
LB_SELITEMRANGEEX Selecteert een opgegeven bereik met items als de index van het eerste item in het bereik kleiner is dan de index van het laatste item in het bereik. Hiermee wordt de selectie in het bereik geannuleerd als de index van het eerste item groter is dan het laatste item.
LB_SETANCHORINDEX Hiermee stelt u het item in dat de muis het laatst heeft geselecteerd voor een opgegeven item.
LB_SETCARETINDEX Hiermee stelt u de focusrechthoek in op een opgegeven keuzelijstitem.
LB_SETCOLUMNWIDTH Hiermee stelt u de breedte in pixels van alle kolommen in een keuzelijst in.
LB_SETCOUNT Hiermee stelt u het aantal items in een keuzelijst in.
LB_SETCURSEL Hiermee selecteert u een opgegeven keuzelijstitem.
LB_SETHORIZONTALEXTENT Hiermee stelt u de schuifbare breedte in pixels van een keuzelijst in.
LB_SETITEMDATA Hiermee koppelt u een waarde aan een keuzelijstitem.
LB_SETITEMHEIGHT Hiermee stelt u de hoogte in pixels van een item of items in een keuzelijst in.
LB_SETLOCALE Hiermee stelt u de landinstelling van een keuzelijst in en retourneert u de eerdere landinstelling-id.
LB_SETSEL Hiermee selecteert u een item in een keuzelijst met meerdere keuzemogelijkheden.
LB_SETTABSTOPS Hiermee stelt u de tabstops in volgens de waarden die zijn opgegeven in een specifieke matrix.
LB_SETTOPINDEX Schuift door de keuzelijst, zodat het opgegeven item zich boven aan het zichtbare bereik bevindt.

Standaard vensterberichtverwerking

De vensterprocedure voor de vooraf gedefinieerde klasse van het keuzelijstvenster voert standaardverwerking uit voor alle berichten die niet door de keuzelijst worden verwerkt. Wanneer de keuzelijstprocedure ONWAAR voor een bericht retourneert, controleert de vooraf gedefinieerde vensterprocedure het bericht en voert de standaardacties uit, zoals wordt weergegeven in de volgende tabel.

Bericht Standaardactie
WM_CHAR Hiermee verplaatst u de selectie naar het eerste item dat begint met het teken dat de gebruiker heeft getypt. Als de keuzelijst de stijl LBS_OWNERDRAW heeft, treedt er geen actie op. Meerdere tekens die binnen een kort interval worden getypt, worden behandeld als een groep en het eerste item dat begint met die reeks tekens wordt geselecteerd.
WM_CREATE Hiermee maakt u een leeg lijstvak.
WM_DESTROY Verwijder de keuzelijst en maak alle gebruikte resources vrij.
Geeft het bericht door aan de dialoogvensterprocedure of het bovenliggende vensterproces.
WM_ENABLE Als het besturingselement zichtbaar is, maakt u de rechthoek ongeldig zodat de tekstreeksen grijs kunnen worden gekleurd.
WM_ERASEBKGND Wisst de achtergrond van een keuzelijst. Als de keuzelijst de stijl LBS_OWNERDRAW heeft, wordt de achtergrond niet gewist.
WM_GETDLGCODE Retourneert DLGC_WANTARROWS | DLGC_WANTCHARS, waarmee wordt aangegeven dat de standaard-lijstvakprocedure de pijltoetsen en WM_CHAR berichten verwerkt.
WM_GETFONT Retourneert een handle naar het huidige lettertype voor het lijstvak.
WM_HSCROLL Schuift de keuzelijst horizontaal.
WM_KEYDOWN Verwerkt virtuele sleutels voor scrollen. De virtuele sleutel is de index van het item waar de caret naar moet worden verplaatst. De selectie wordt niet gewijzigd.
WM_KILLFOCUS Zet de caret uit en vernietigt het. Hiermee wordt een LBN_KILLFOCUS meldingscode verzonden naar de eigenaar van de lijstbox.
WM_LBUTTONDBLCLK Volgt de muis in het lijstvakgebied. Hierdoor kan de gebruiker een selectie annuleren als de muisknop buiten het keuzelijstclientgebied wordt vrijgegeven.
WM_LBUTTONDOWN Houdt de muis bij in het clientgebied van het keuzelijstvak. Hierdoor kan de gebruiker een selectie annuleren als de muisknop buiten het keuzelijstclientgebied wordt vrijgegeven.
WM_LBUTTONUP Houdt de muis bij in het keuzelijstclientgebied. Hierdoor kan de gebruiker een selectie annuleren als de muisknop buiten het keuzelijstclientgebied wordt vrijgegeven.
WM_MOUSEMOVE Houdt de muis bij in het keuzelijstclientgebied. Hierdoor kan de gebruiker een selectie annuleren als de muisknop buiten het keuzelijstclientgebied wordt vrijgegeven.
WM_PAINT Voert een subklasseverfbewerking uit met behulp van de keuzelijstgreep naar de apparaatcontext (DC).
WM_SETFOCUS Hiermee schakelt u de caret in en verzendt u een LBN_SETFOCUS meldingscode naar de eigenaar van het lijstvak.
WM_SETFONT Hiermee stelt u een nieuw lettertype in voor de keuzelijst.
WM_SETREDRAW Hiermee stelt u de vlag voor opnieuw tekenen in of wist deze op basis van de waarde van wParam.
WM_SIZE Wijzigt het formaat van de keuzelijst naar een geheel aantal items.
WM_VSCROLL Schuift de keuzelijst verticaal.

De vooraf gedefinieerde keuzelijstprocedure geeft alle andere berichten door aan DefWindowProc- voor standaardverwerking.

Owner-Drawn lijstvakken

Een toepassing kan een door de eigenaar getekend lijstvak maken om de verantwoordelijkheid te nemen voor het tekenen van lijstitems. Het bovenliggende venster of dialoogvenster van een door de eigenaar getekende lijst (de eigenaar) ontvangt WM_DRAWITEM berichten wanneer een deel van de lijst moet worden getekend. Een door de eigenaar getekende keuzelijst kan andere informatie bevatten dan of naast tekenreeksen.

De eigenaar van een eigenaar-aangemaakt lijstvak 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 het lijstvak.

Een toepassing kan een door de eigenaar getekende keuzelijst maken door de stijl LBS_OWNERDRAWFIXED of LBS_OWNERDRAWVARIABLE op te geven. Als alle lijstitems in de keuzelijst dezelfde hoogte hebben, zoals tekenreeksen of pictogrammen, kan een toepassing de stijl LBS_OWNERDRAWFIXED gebruiken. Als lijstitems van verschillende hoogte (bijvoorbeeld bitmaps van verschillende grootte) zijn, kan een toepassing de stijl LBS_OWNERDRAWVARIABLE gebruiken.

De eigenaar van een door de eigenaar getekende keuzelijst kan een WM_MEASUREITEM bericht verwerken om de afmetingen van lijstitems op te geven. Als de toepassing de keuzelijst maakt met behulp van de stijl LBS_OWNERDRAWFIXED, verzendt het systeem het WM_MEASUREITEM bericht slechts één keer. De dimensies die door de eigenaar worden opgegeven, worden gebruikt voor alle lijstitems. Als de stijl LBS_OWNERDRAWVARIABLE wordt gebruikt, verzendt het systeem een WM_MEASUREITEM bericht voor elk lijstitem dat aan de keuzelijst wordt toegevoegd. De eigenaar kan de hoogte van een lijstitem op elk gewenst moment bepalen of instellen door respectievelijk de LB_GETITEMHEIGHT en LB_SETITEMHEIGHT berichten te gebruiken.

Als de informatie die wordt weergegeven in een door de eigenaar getekende keuzelijst tekst bevat, kan een toepassing de tekst voor elk lijstitem bijhouden door de LBS_HASSTRINGS stijl op te geven. Keuzelijsten met de stijl LBS_SORT worden gesorteerd op basis van deze tekst. Als een lijstvak is gesorteerd, maar niet van de LBS_HASSTRINGS stijl is, moet de eigenaar het WM_COMPAREITEM-bericht verwerken.

In een door de eigenaar getekende lijst moet de eigenaar de lijstitems bijhouden die andere informatie bevatten dan of naast tekst. Een handige manier om dit te doen, is door de verwijzing naar de informatie op te slaan als itemgegevens met behulp van het LB_SETITEMDATA bericht. Als u gegevensobjecten wilt vrijmaken die zijn gekoppeld aan items in een lijstvak, kan de eigenaar het WM_DELETEITEM bericht verwerken.

Zie Een Owner-Drawn keuzelijst makenvoor een voorbeeld van een door de eigenaar getekende keuzelijst.

Lijstvakken slepen

Een keuzelijst met slepen is een speciaal type keuzelijst waarmee de gebruiker items van de ene positie naar de andere kan slepen. Een toepassing kan een versleepbare lijst gebruiken om tekstitems in een bepaalde volgorde weer te geven en stelt de gebruiker in staat de volgorde te wijzigen door de items naar de gewenste positie te slepen.

Keuzelijsten voor slepen maken

Sleep keuzelijsten hebben dezelfde vensterstijlen en verwerken dezelfde berichten als standaard keuzelijsten. Als u een keuzelijst met slepen wilt maken, maakt u eerst een standaard keuzelijst en roept u de functie MakeDragList aan. Als u een keuzelijst in een dialoogvenster wilt converteren naar een keuzelijst met slepen, kunt u MakeDragList- aanroepen wanneer het WM_INITDIALOG bericht wordt verwerkt.

Berichten van keuzelijst slepen

Een sleepbare lijstvak stelt het oudervenster op de hoogte van sleepevenementen door een sleeplijstbericht te verzenden. Het bovenliggende venster moet het 'drag list'-bericht verwerken.

De draglistbox registreert dit bericht wanneer de MakeDragList functie wordt aangeroepen. Als u de bericht-id (numerieke waarde) van het sleeplijstbericht wilt ophalen, roept u de functie RegisterWindowMessage aan en geeft u de waarde DRAGLISTMSGSTRING op.

De parameter wParam van het slepenlijstbericht is de id voor de sleepenlijst. De parameter lParam is het adres van een DRAGLISTINFO structuur, die de meldingscode voor de draggebeurtenis en andere informatie bevat. De retourwaarde van het bericht is afhankelijk van de melding.

Meldingscodes voor sleepbare keuzelijst

De meldingscode voor de sleep-lijst, geïdentificeerd door het lid uNotification van de DRAGLISTINFO structuur die is opgenomen in het bericht van de sleep-lijst, kan DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGof DL_DROPPEDzijn.

De DL_BEGINDRAG meldingscode wordt verzonden wanneer de cursor zich op een lijstitem bevindt en de gebruiker op de linkermuisknop klikt. Het oudervenster kan TRUE- retourneren om de sleepbewerking te starten of FALSE- om slepen niet toe te laten. Op deze manier kan het bovenliggende venster slepen inschakelen voor sommige lijstitems en het uitschakelen voor anderen. U kunt bepalen welk lijstitem zich op de opgegeven locatie bevindt met behulp van de functie LBItemFromPt.

Als slepen van kracht is, wordt de DL_DRAGGING meldingscode verzonden wanneer de muis wordt verplaatst of met regelmatige tussenpozen als de muis niet wordt verplaatst. Het oudervenster moet eerst het lijstitem onder de cursor bepalen met behulp van LBItemFromPt en vervolgens het invoegenpictogram tekenen met behulp van de functie DrawInsert. Door TRUE- op te geven voor de parameter bAutoScroll van LBItemFromPt, kunt u ervoor zorgen dat de keuzelijst met één regel schuift als de cursor zich boven of onder het clientgebied bevindt. De waarde die u voor deze melding retourneert, geeft het type muiscursor op dat het sleepbare lijstvak moet instellen.

De DL_CANCELDRAG meldingscode wordt verzonden als de gebruiker een sleepbewerking annuleert door op de rechtermuisknop te klikken of op esc te drukken. De DL_DROPPED meldingscode wordt verzonden als de gebruiker een sleepbewerking voltooit door de linkermuisknop los te laten, zelfs als de cursor zich niet boven een lijstitem bevindt. Het sleep-lijstvak geeft de muisopslag vrij voordat een van beide meldingen wordt verzonden. De retourwaarde van deze twee meldingen wordt genegeerd. Lijst verslepen