Om listrutor

En listrutekontroll innehåller en enkel lista som användaren vanligtvis kan välja ett eller flera objekt från. Listboxar ger en begränsad flexibilitet jämfört med listvy kontroll.

Listruteobjekt kan representeras av textsträngar, bitmappar eller både och. Om listrutan inte är tillräckligt stor för att visa alla listruteobjekt samtidigt, innehåller listrutan en rullningslist. Användaren bläddrar igenom listrutans objekt och tillämpar eller tar bort markeringsstatus efter behov. Om du väljer ett listruteobjekt ändras dess visuella utseende, vanligtvis genom att ändra text- och bakgrundsfärgerna till de som anges av relevanta operativsystemmått. När användaren väljer eller avmarkerar ett objekt skickar systemet ett meddelande till det överordnade fönstret i listrutan.

För ett ANSI-program konverterar systemet texten i en listruta till Unicode med hjälp av CP_ACP kodsidan. Detta kan orsaka problem. Till exempel, accentuerade romerska tecken i en icke-Unicode listruta i Windows, japanska versionen kommer ut förvrängda. Åtgärda detta genom att antingen kompilera programmet som Unicode eller använda en ägarritad listruta.

I det här avsnittet beskrivs följande ämnen:

Skapa en listruta

Det enklaste sättet att skapa en listruta i en dialogruta är att dra den från verktygslådan i Microsoft Visual Studio till din dialogresurs. Om du vill skapa en listruta dynamiskt eller för att skapa en listruta i ett annat fönster än en dialogruta använder du funktionen CreateWindowEx och anger WC_LISTBOX-fönsterklassen och lämpliga listruteformat.

Listrutetyper och formatmallar

Det finns två typer av listrutor: enkelval (standard) och flera val. I en listruta med en enda markering kan användaren bara välja ett objekt i taget. I en listruta med flera val kan användaren välja fler än ett objekt i taget. Om du vill skapa en listruta med flera val anger du formatet LBS_MULTIPLESEL eller LBS_EXTENDEDSEL.

Utseendet och funktionen för en listruta styrs av listruteformat och fönsterformat. Dessa format anger om listan är sorterad, ordnad i flera kolumner, ritad av programmet och så vidare. Dimensioner och format för en listruta definieras vanligtvis i en dialogrutemall som ingår i ett programs resurser.

Note

Om du vill använda visuella format med dessa kontroller måste ett program innehålla ett manifest och anropa InitCommonControls i början av programmet. Information om visuella format finns i Visual Styles. Information om manifest finns i Aktivera visuella format.

Listboxfunktioner

Funktionen DlgDirList ersätter innehållet i en listruta med namnen på enheter, kataloger och filer som matchar en angiven uppsättning kriterier. Funktionen DlgDirSelectEx hämtar den aktuella markeringen i en listruta som initieras av DlgDirList. Dessa funktioner gör det möjligt för användaren att välja en enhet, katalog eller fil från en listruta utan att skriva filens plats och namn.

Funktionen GetListBoxInfo returnerar också antalet objekt per kolumn i en angiven listruta.

Aviseringsmeddelanden från listrutor.

När en händelse inträffar i en listruta skickar listrutan en meddelandekod i form av ett WM_COMMAND meddelande till dialogrutan i ägarfönstret. Meddelandekoder för listrutor skickas när en användare väljer, dubbelklickar eller avbryter ett listruteobjekt. när listrutan tar emot eller förlorar tangentbordets fokus; och när systemet inte kan allokera tillräckligt med minne för en listrutebegäran. Ett WM_COMMAND-meddelande innehåller listruteidentifieraren i lågordningsordet i parametern wParam och meddelandekoden i högordningsordet. Parametern lParam innehåller kontrollfönstrets handtag.

En dialogruteprocedur krävs inte för att bearbeta dessa meddelanden. standardfönsterproceduren bearbetar dem.

Ett program bör övervaka och bearbeta följande aviseringskoder i listrutan.

Meddelandekod Beskrivning
LBN_DBLCLK Användaren dubbelklickar på ett objekt i listrutan.
LBN_ERRSPACE Listrutan kan inte allokera tillräckligt med minne för att uppfylla en begäran.
LBN_KILLFOCUS Listrutan förlorar tangentbordets fokus.
LBN_SELCANCEL Användaren avbryter valet av ett objekt i listrutan.
LBN_SELCHANGE Markeringen i en listruta håller på att ändras.
LBN_SETFOCUS Listrutan tar emot tangentbordsfokus.

Meddelanden till listrutor

En dialogruteprocedur kan skicka meddelanden till en listruta för att lägga till, ta bort, undersöka och ändra poster i listrutan. En dialogruteprocedur kan till exempel skicka ett LB_ADDSTRING meddelande till en listruta för att lägga till ett objekt och ett LB_GETSEL meddelande för att avgöra om objektet är markerat. Andra meddelanden anger och hämtar information om listrutans storlek, utseende och beteende. Meddelandet LB_SETHORIZONTALEXTENT anger till exempel den rullningsbara bredden för en listruta. En dialogruteprocedur kan skicka alla meddelanden till en listruta med hjälp av funktionen SendMessage eller SendDlgItemMessage.

Ett listruteobjekt refereras ofta till av dess index, ett heltal som representerar objektets position i listrutan. Indexet för det första objektet i en listruta är 0, indexet för det andra objektet är 1 och så vidare.

I följande tabell beskrivs hur den fördefinierade listruteproceduren svarar på listrutemeddelanden.

Meddelande Svar
LB_ADDFILE Infogar en fil i en kataloglistruta som fylls i av funktionen DlgDirList och hämtar listruteindexet för det infogade objektet.
LB_ADDSTRING Lägger till en sträng i en listruta och returnerar dess index.
LB_DELETESTRING Tar bort en sträng från en listruta och returnerar antalet strängar som finns kvar i listan.
LB_DIR Lägger till en lista med filnamn i en listruta och returnerar indexet för det senaste filnamnet som lades till.
LB_FINDSTRING Returnerar indexet för den första strängen i listrutan som börjar med en angiven sträng.
LB_FINDSTRINGEXACT Returnerar indexet för strängen i listrutan som är lika med en angiven sträng.
LB_GETANCHORINDEX Returnerar indexet för det objekt som musen senast markerade.
LB_GETCARETINDEX Returnerar indexet för objektet som har fokusrektangeln.
LB_GETCOUNT Returnerar antalet objekt i listrutan.
LB_GETCURSEL Returnerar indexet för det markerade objektet.
LB_GETHORIZONTALEXTENT Returnerar den rullningsbara bredden i bildpunkter för en listruta.
LB_GETITEMDATA Returnerar det värde som är associerat med det angivna objektet.
LB_GETITEMHEIGHT Returnerar höjden i bildpunkter för ett objekt i en listruta.
LB_GETITEMRECT Hämtar klientkoordinaterna för det angivna listboxposten.
LB_GETLOCALE Hämtar nationella inställningar för listrutan. Högordningsordet innehåller lands-/regionkoden och lågordningsordet innehåller språkidentifieraren.
LB_GETSEL Returnerar markeringstillståndet för ett listelement.
LB_GETSELCOUNT Returnerar antalet markerade objekt i en listruta med flera val.
LB_GETSELITEMS Skapar en matris med index för alla markerade objekt i en listruta med flera val och returnerar det totala antalet markerade objekt.
LB_GETTEXT Hämtar strängen som är associerad med ett angivet objekt och längden på strängen.
LB_GETTEXTLEN Returnerar längden, i tecken, på strängen som är associerad med ett angivet objekt.
LB_GETTOPINDEX Returnerar indexet för det första synliga objektet i en listruta.
LB_INITSTORAGE Allokerar minne för det angivna antalet objekt och deras associerade strängar.
LB_INSERTSTRING Infogar en sträng vid ett angivet index i en listruta.
LB_ITEMFROMPOINT Hämtar det nollbaserade indexet för objektet närmast den angivna punkten i en listruta.
LB_RESETCONTENT Tar bort alla objekt från en listruta.
LB_SELECTSTRING Väljer den första strängen som hittas som matchar ett angivet prefix.
LB_SELITEMRANGE Markerar ett angivet intervall med objekt i en listruta.
LB_SELITEMRANGEEX Markerar ett angivet intervall med objekt om indexet för det första objektet i intervallet är mindre än indexet för det sista objektet i intervallet. Avbryter markeringen i intervallet om indexet för det första objektet är större än det förra.
LB_SETANCHORINDEX Anger det objekt som musen senast markerade till ett angivet objekt.
LB_SETCARETINDEX Anger fokusrektangeln till ett angivet listruteobjekt.
LB_SETCOLUMNWIDTH Anger bredden i bildpunkter för alla kolumner i en listruta.
LB_SETCOUNT Anger antalet objekt i en listruta.
LB_SETCURSEL Markerar ett angivet objekt i listruta.
LB_SETHORIZONTALEXTENT Anger den rullningsbara bredden i bildpunkter för en listruta.
LB_SETITEMDATA Associerar ett värde med ett listruteobjekt.
LB_SETITEMHEIGHT Anger höjden i bildpunkter för ett objekt eller objekt i en listruta.
LB_SETLOCALE Anger språkvarianten för en listruta och returnerar den tidigare språkidentifieraren.
LB_SETSEL Markerar ett objekt i en listruta med flera val.
LB_SETTABSTOPS Anger flikens stopp till de som anges i en angiven matris.
LB_SETTOPINDEX Rullar listrutan så att det angivna objektet är överst i det synliga intervallet.

Standardfönstrets meddelandebearbetning

Fönsterproceduren för den fördefinierade listrutefönsterklassen utför standardbearbetning för alla meddelanden som listrutan inte bearbetar. När listruteproceduren returnerar FALSE- för ett meddelande kontrollerar den fördefinierade fönsterproceduren meddelandet och utför standardåtgärder, enligt följande tabell.

Meddelande Standardåtgärd
WM_CHAR Flyttar markeringen till det första objektet som börjar med det tecken som användaren skrev. Om listrutan har formatet LBS_OWNERDRAW inträffar ingen åtgärd. Flera tecken som skrivs inom ett kort intervall behandlas som en grupp, och det första objektet som börjar med den serien med tecken är markerat.
WM_CREATE Skapar en tom listruta.
WM_DESTROY Förstör listrutan och frigör alla resurser som används.
Skickar meddelandet till dialogruteproceduren eller den överordnade fönsterprocessen.
WM_ENABLE Om kontrollen är synlig görs rektangeln ogiltig så att strängarna kan målas i grått.
WM_ERASEBKGND Raderar bakgrunden i en listruta. Om listrutan har formatet LBS_OWNERDRAW raderas inte bakgrunden.
WM_GETDLGCODE Returnerar DLGC_WANTARROWS | DLGC_WANTCHARS som anger att standardproceduren för listrutan hanterar piltangenterna och WM_CHAR meddelanden.
WM_GETFONT Returnerar en referens till det aktuella teckensnittet för listrutan.
WM_HSCROLL Rullar listrutan vågrätt.
WM_KEYDOWN Bearbetar virtuella nycklar för rullning. Den virtuella nyckeln är indexet för objektet som careten ska flyttas till. Valet ändras inte.
WM_KILLFOCUS Stänger av careten och förstör den. Skickar en LBN_KILLFOCUS meddelandekod till listrutans ägare.
WM_LBUTTONDBLCLK Spårar musen i listrutans klientområde. Detta gör att användaren kan avbryta ett val om musknappen släpps utanför listrutans klientområde.
WM_LBUTTONDOWN Spårar musen i listrutans klientområde. Detta gör att användaren kan avbryta ett val om musknappen släpps utanför listrutans klientområde.
WM_LBUTTONUP Spårar musen i listlådans klientområde. Detta gör att användaren kan avbryta ett val om musknappen släpps utanför listrutans klientområde.
WM_MOUSEMOVE Spårar musen i listrutans klientområde. Detta gör att användaren kan avbryta ett val om musknappen släpps utanför listrutans klientområde.
WM_PAINT Utför en underklassad färgåtgärd med hjälp av listrutehandtaget till enhetskontexten (DC).
WM_SETFOCUS Aktiverar caret och skickar en LBN_SETFOCUS meddelandekod till listrutans ägare.
WM_SETFONT Anger ett nytt teckensnitt för listrutan.
WM_SETREDRAW Anger eller rensar flaggan för att rita om baserat på värdet för wParam.
WM_SIZE Ändrar storlek på listrutan till ett heltal med objekt.
WM_VSCROLL Rullar listrutan lodrätt.

Den fördefinierade listruteproceduren skickar alla andra meddelanden till DefWindowProc för standardbearbetning.

Owner-Drawn Listor

Ett program kan skapa en ägarritad listruta för att ta ansvar för att rita listobjekt. Det överordnade fönstret eller dialogrutan i en ägarritad listruta (dess ägare) tar emot WM_DRAWITEM meddelanden när en del av listrutan måste målas. En anpassad listruta kan visa annan information än, eller utöver, textsträngar.

Ägaren till en egenritad listruta måste bearbeta meddelandet WM_DRAWITEM. Det här meddelandet skickas när en del av listrutan måste ritas om. Ägaren kan behöva bearbeta andra meddelanden, beroende på de format som angetts för listrutan.

Ett program kan skapa en ägarritad listbox genom att ange LBS_OWNERDRAWFIXED eller LBS_OWNERDRAWVARIABLE stil. Om alla listobjekt i listrutan har samma höjd, till exempel strängar eller ikoner, kan ett program använda formatet LBS_OWNERDRAWFIXED. Om listobjekt är av varierande höjd (till exempel bitmappar av olika storlek) kan ett program använda LBS_OWNERDRAWVARIABLE formatmall.

Ägaren till en ägarrenderad listruta kan bearbeta ett WM_MEASUREITEM-meddelande för att ange måtten för listelement. Om programmet skapar listrutan med hjälp av LBS_OWNERDRAWFIXED formatmall skickar systemet endast WM_MEASUREITEM meddelande en gång. De dimensioner som anges av ägaren används för alla listobjekt. Om formatet LBS_OWNERDRAWVARIABLE används skickar systemet ett WM_MEASUREITEM meddelande för varje listobjekt som läggs till i listrutan. Ägaren kan bestämma eller ange höjden på ett listobjekt när som helst med hjälp av LB_GETITEMHEIGHT respektive LB_SETITEMHEIGHT meddelanden.

Om informationen som visas i en ägarritad listbox innehåller text kan en applikation hålla reda på texten för varje listobjekt genom att ange stilen LBS_HASSTRINGS. Listrutor med stilen LBS_SORT sorteras utifrån denna text. Om en listbox är sorterad, men inte är av stilen LBS_HASSTRINGS, måste ägaren bearbeta meddelandet WM_COMPAREITEM.

I en ruta med ägarritade listor måste ägaren hålla reda på listobjekt som innehåller annan information än eller utöver text. Ett praktiskt sätt att göra detta är att spara handtaget till informationen som elementdata med hjälp av ett LB_SETITEMDATA meddelande. Om du vill frigöra dataobjekt som är associerade med objekt i en listruta kan ägaren bearbeta WM_DELETEITEM meddelandet.

För ett exempel på en egenritad listruta, se Så här skapar du en Owner-Drawn listruta.

Dra listboxar

En dragningsbar listruta är en särskild typ av listruta som gör att användaren kan dra objekt från en position till en annan. Ett program kan använda en draglistruta för att visa strängar i en viss sekvens och göra det möjligt för användaren att ändra sekvensen genom att dra objekten på plats.

Skapa dra-och-släpp-listor

Dra listboxar har samma fönsterstilar och bearbetar samma meddelanden som standardlistboxar. Om du vill skapa en dragningslistruta skapar du först en standardlistruta och anropar sedan funktionen MakeDragList. Om du vill konvertera en listruta i en dialogruta till en draglistruta kan du anropa MakeDragList- när WM_INITDIALOG-meddelandet bearbetas.

Dra Listfältmeddelanden

En draglistabox meddelar det överordnade fönstret om draghändelser genom att skicka ett draglistemeddelande. Det överordnade fönstret måste bearbeta draglistmeddelandet.

Dra listrutan registrerar det här meddelandet när funktionen MakeDragList anropas. Om du vill hämta meddelandeidentifieraren (numeriskt värde) för draglistmeddelandet anropar du funktionen RegisterWindowMessage och anger värdet DRAGLISTMSGSTRING.

Parametern wParam i draglistmeddelandet är kontrollidentifieraren för draglistrutan. Parametern lParam är adressen till en DRAGLISTINFO- struktur, som innehåller meddelandekoden för draghändelsen och annan information. Returvärdet för meddelandet beror på aviseringen.

Meddelandekoder för dragbar listruta

Meddelandekoden för draglistan, som identifieras av uNotification medlem i DRAGLISTINFO struktur som ingår i draglistmeddelandet, kan vara DL_BEGINDRAG, DL_DRAGGING, DL_CANCELDRAGeller DL_DROPPED.

Den DL_BEGINDRAG meddelandekoden skickas när markören finns på ett listobjekt och användaren klickar på den vänstra musknappen. Det överordnade fönstret kan returnera SANT för att påbörja dra-åtgärden eller FALSKT för att inte tillåta dragning. På detta vis kan det överordnade fönstret aktivera drag och släpp för vissa listelement och inaktivera det för andra objekt. Du kan avgöra vilket listobjekt som finns på den angivna platsen med hjälp av funktionen LBItemFromPt.

När dragning är aktiv skickas DL_DRAGGING-meddelandekoden när musen flyttas, eller regelbundet om musen inte flyttas. Det överordnade fönstret bör först fastställa listobjektet under markören med hjälp av LBItemFromPt och sedan rita infogningsikonen med hjälp av funktionen DrawInsert. Genom att ange TRUE- för bAutoScroll parametern för LBItemFromPtkan du få listrutan att rulla med en rad om markören ligger ovanför eller under dess klientområde. Värdet som du returnerar för det här meddelandet anger vilken typ av musmarkör som ska anges i draglistrutan.

Den DL_CANCELDRAG meddelandekoden skickas om användaren avbryter en dragåtgärd genom att klicka på höger musknapp eller trycka på ESC-tangenten. Den DL_DROPPED meddelandekoden skickas om användaren slutför en dragåtgärd genom att släppa den vänstra musknappen, även om markören inte är över ett listobjekt. Dra listrutan släpper musfångsten innan du skickar något av meddelandena. Returvärdet för dessa två meddelanden ignoreras. Dra lista