Om rullningslister

Ett fönster kan visa ett dataobjekt, till exempel ett dokument eller en bitmapp, som är större än fönstrets klientområde. När det finns en rullningslist kan användaren rulla ett dataobjekt i klientområdet för att visa de delar av objektet som sträcker sig utanför fönstrets kantlinjer.

Rullningslister bör ingå i alla fönster där innehållet i klientområdet sträcker sig utanför fönstrets kantlinjer. Rullningslistens orientering avgör i vilken riktning rullningen sker när användaren använder rullningslisten. Med en vågrät rullningslist kan användaren rulla innehållet i ett fönster till vänster eller höger. Med en lodrät rullningslist kan användaren rulla upp eller ned innehållet.

Följande avsnitt beskrivs i det här avsnittet.

Delar av en rullningslist

En rullningslist består av en skuggad axel med en pilknapp i varje ände och en rullningsruta (kallas ibland tumme) mellan pilknapparna. En rullningslist representerar den totala längden eller bredden på ett dataobjekt i ett fönsters klientområde. rullningsrutan representerar den del av objektet som visas i klientområdet. Rullningsrutans position ändras när användaren rullar ett dataobjekt för att visa en annan del av den. Systemet justerar också storleken på rullningslistens rullningsruta så att den anger vilken del av hela dataobjektet som för närvarande visas i fönstret. Om det mesta av objektet är synligt upptar rullningsrutan det mesta av rullningslistaxeln. På samma sätt, om bara en liten del av objektet är synligt, upptar rullningsrutan en liten del av rullningslistaxeln.

Användaren rullar innehållet i ett fönster genom att klicka på en av pilknapparna, genom att klicka på området i den skuggade rullningslistaxeln eller genom att dra rullningsrutan. När användaren klickar på en pilknapp rullar programmet innehållet med en enhet (vanligtvis en enda rad eller kolumn). När användaren klickar på de skuggade områdena rullar programmet innehållet i ett fönster. Hur mycket rullning som inträffar när användaren drar rullningsrutan beror på vilket avstånd användaren drar i rullningsrutan och på rullningslistens rullningsintervall. Mer information om rullningsintervallet finns i Rullningsruteposition och rullningsintervall.

Följande skärmbild visar en omfattande redigeringskontroll med lodräta och vågräta rullningslister, som de kan visas i Windows Vista. Den lodräta rullningslisten är för närvarande "het" eftersom muspekaren hovrar över den när skärmbilden togs.

skärmbild av en omfattande redigeringskontroll med rullningslister

Standardrullningslister och reglage för rullningslister

En rullningslist ingår i ett fönster antingen som en vanlig rullningslist eller som en rullningslistkontroll. En standardrullningslist finns i det icke-klientområdet i ett fönster. Den skapas med fönstret och visas när fönstret visas. Det enda syftet med en vanlig rullningslist är att göra det möjligt för användaren att generera rullningsbegäranden för att visa hela innehållet i klientområdet. Du kan inkludera en standardrullningslist i ett fönster genom att ange WS_HSCROLL, WS_VSCROLLeller båda formatmallarna när du skapar fönstret. Formatet WS_HSCROLL skapar en vågrät rullningslist placerad längst ned i klientområdet. Formatet WS_VSCROLL skapar en lodrät rullningslist placerad till höger om klientområdet. De SM_CXHSCROLL och SM_CYHSCROLL systemmåttvärdena definierar bredden och höjden på en vågrät standardrullningslist. Värdena SM_CXVSCROLL och SM_CYVSCROLL definierar bredden och höjden på en lodrät standardrullningslist. En vanlig rullningslist är en del av det associerade fönstret och har därför inget eget fönsterhandtag.

En rullningslistkontroll är ett kontrollfönster som tillhör RULLNINGSLIST-fönsterklassen. En rullningslistkontroll visas och fungerar som en vanlig rullningslist, men det är ett separat fönster. Som ett separat fönster får en rullningskontroll direkt indatafokus. Till skillnad från en vanlig rullningslist har en rullningslistkontroll också ett inbyggt tangentbordsgränssnitt.

Du kan använda så många rullningslistkontroller som behövs i ett enda fönster. När du skapar en rullningslistkontroll måste du ange rullningslistens storlek och position. Men om en rullningslistans kontrollfönster kan ändras i storlek, måste justeringar av rullningslistens storlek göras när fönstrets storlek ändras.

Fördelen med att använda en vanlig rullningslist är att systemet skapar rullningslisten och automatiskt anger sin storlek och position. Standardrullningsfält är dock ibland alltför restriktiva. Anta till exempel att du vill dela upp ett klientområde i kvadranter och använda en separat uppsättning rullningslister för att styra innehållet i varje kvadrant. Du kan inte använda standardrullningslister eftersom du bara kan skapa en uppsättning rullningslister för ett visst fönster. Använd rullningslistkontroller i stället eftersom du kan lägga till så många av dem i ett fönster som du vill.

Program kan tillhandahålla rullningslistkontroller för andra syften än att rulla innehållet i ett fönster. Ett skärmsläckarprogram kan till exempel ge en rullningslist för att ange den hastighet med vilken grafik flyttas på skärmen.

En rullningslistkontroll kan ha ett antal formatmallar som styr orienteringen och positionen för rullningslisten. Du anger vilka format du vill använda när du anropar funktionen CreateWindowEx för att skapa en rullningslistkontroll. Vissa formatmallar skapar en rullningslistkontroll som använder en standardbredd eller standardhöjd. Du måste dock alltid ange x- och y-koordinaterna och de andra dimensionerna i rullningslisten.

En tabell med kontrollformat för rullningslister finns i Kontrollformat för rullningslister.

Not

Om du vill använda visuella format med rullningslister 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 manifester finns i Aktivera visuella stilar.

 

Rullningsruteposition och rullningsintervall

Rullningsrutans position representeras som ett heltal. Den är relativ till den vänstra eller övre delen av rullningslisten, beroende på om rullningslisten är vågrät eller lodrät. Positionen måste ligga inom minimi- och maxvärdena för rullningsintervallet. I till exempel en rullningslist med intervallet 0 till 100 är position 50 i mitten, med de återstående positionerna fördelade lika längs rullningslisten. Det inledande intervallet beror på rullningslisten. Standardrullningslister har ett initialt intervall på 0 till 100. rullningslistkontroller har ett tomt intervall (både lägsta och högsta värden är noll), såvida du inte anger ett explicit intervall när kontrollen skapas. Du kan ändra intervallet när som helst. Du kan använda funktionen SetScrollInfo för att ange intervallvärdena och funktionen GetScrollInfo för att hämta de aktuella intervallvärdena.

Ett program justerar vanligtvis rullningsintervallet till praktiska heltal, vilket gör det enkelt att översätta rullningsrutepositionen till ett värde som motsvarar dataobjektet som ska rullas. Om ett program till exempel måste visa 260 rader i en textfil i ett fönster som bara kan visa 16 rader åt gången, kan det lodräta rullningslistområdet anges till 1 till 244. Om rullningsrutan är på plats 1 visas den första raden överst i fönstret. Om rullningsrutan är på plats 244 kommer den sista raden (rad 260) att vara längst ned i fönstret. Om ett program försöker ange ett positionsvärde som är mindre än minimivärdet eller mer än det maximala, används värdet för minsta eller högsta rullningsintervall i stället.

Du kan ange en sidstorlek för en rullningslist. Den sidstorleken anger hur många dataenheter som kan passa in i klientområdet på ägarfönstret, med hänsyn till dess nuvarande storlek. Om klientområdet till exempel kan innehålla 16 textrader skulle ett program ange sidstorleken till 16. Systemet använder sidstorleken, tillsammans med rullningsintervallet och längden på rullningslistaxeln, för att ange rullningsrutans storlek. När ett fönster som innehåller en rullningslist ändras i storlek bör en applikation anropa funktionen SetScrollInfo för att ange sidstorleken. En applikation kan hämta den aktuella sidstorleken genom att anropa funktionen GetScrollInfo.

För att upprätta en användbar relation mellan rullningslistområdet och dataobjektet måste ett program justera intervallet när storleken på dataobjektet ändras.

När användaren flyttar rullningsknappen i en rullningslist rapporterar rullningslisten rullningsknappens position som ett heltal i rullningsintervallet. Om positionen är det minsta värdet ligger rullningsrutan överst i en lodrät rullningslist eller i den vänstra änden av en vågrät rullningslist. Om positionen är det maximala värdet ligger rullningsrutan längst ned i en lodrät rullningslist eller till höger i en vågrät rullningslist.

Det maximala värde som en rullningslist kan rapportera (dvs. den maximala rullningspositionen) beror på sidstorleken. Om rullningslisten har en sidstorlek som är större än en, är den maximala rullningspositionen mindre än det maximala intervallvärdet. Du kan använda följande formel för att beräkna den maximala rullningspositionen:

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

Ett program måste flytta rullningsrutan i en rullningslist. Även om användaren begär rullning i en rullningslist, uppdateras inte rullningsrutans position automatiskt. I stället skickas begäran till det överordnade fönstret, som måste skrolla data och uppdatera skrollrutans position. Ett program använder funktionen SetScrollInfo för att uppdatera rullningsrutepositionen. Annars används funktionen SetScrollPos. Eftersom den styr rullningsruteförflyttningen kan programmet flytta rullningsrutan i steg som fungerar bäst för de data som rullas.

Synlighet för rullningslist

Systemet döljer och inaktiverar en standardrullningslist när samma lägsta och högsta värden anges. Systemet döljer och inaktiverar även en vanlig rullningslist om du anger en sidstorlek som innehåller hela rullningslistens rullningsintervall. Det här är ett sätt att tillfälligt dölja en rullningslist när den inte behövs för innehållet i klientområdet. Du behöver inte göra rullningsbegäranden genom rullningslisten när den är dold. Systemet aktiverar rullningslisten och visar den igen när du anger lägsta och högsta värden till olika värden och när sidstorleken inte innehåller hela rullningsintervallet. Funktionen ShowScrollBar kan också användas för att dölja eller visa en rullningslist. Det påverkar inte rullningslistens intervall, sidstorlek eller rullningsruteposition.

Funktionen EnableScrollBar kan användas för att inaktivera en eller båda pilarna i en rullningslist. Ett program visar inaktiverade pilar i grått och svarar inte på användarindata.

Begäranden om scrollbar

Användaren gör rullningsbegäranden genom att klicka på olika delar av en rullningslist. Systemet skickar begäran till det angivna fönstret i form av ett WM_HSCROLL eller WM_VSCROLL meddelande. En vågrät rullningslist skickar meddelandet WM_HSCROLL. en lodrät rullningslist skickar meddelandet WM_VSCROLL. Varje meddelande innehåller en begäranskod som motsvarar användarens åtgärd, till handtaget till rullningslisten (endast rullningslistkontroller) och i vissa fall till rullningsrutans position.

Följande diagram visar den begärandekod som användaren genererar när de klickar på olika delar av en rullningslist.

diagram som visar de begärandekoder som är associerade med varje region på två rullningslister

Värdena för SB_ anger vilken åtgärd användaren vidtar. Ett program undersöker de koder som medföljer WM_HSCROLL och WM_VSCROLL meddelanden och utför sedan lämplig rullningsåtgärd. I följande tabell anges användarens åtgärd för varje värde, följt av programmets svar. I varje fall definieras en enhet av programmet efter behov för data. Till exempel är den typiska enheten för rullning av text lodrätt en textrad.

Begäran Handling Svar
SB_LINEUP Användaren klickar på den övre rullningspilen. Minskar rullningsrutans position; rullar mot toppen av data med en enhet.
SB_LINEDOWN Användaren klickar på den nedre rullningspilen. Ökar rullningsrutepositionen; rullar mot slutet av datan med ett steg.
SB_LINELEFT Användaren klickar på den vänstra rullningspilen. Minskar rullningsrutans position; rullar mot den vänstra änden av data med en enhet.
SB_LINERIGHT Användaren klickar på den högra rullningspilen. Ökar skjutreglagets position. Rullar mot den högra änden av datan med ett steg.
SB_PAGEUP Användaren klickar på rullningslistaxeln ovanför rullningsrutan. Minskar rullningsrutans position med antalet dataenheter i fönstret. rullar mot toppen av data med samma antal enheter.
SB_PAGEDOWN Användaren klickar på rullningslistaxeln under rullningsrutan. Ökar rullningsrutans position med antalet dataenheter som finns i fönstret. Rullar rullningsrutan mot botten av fönstret med samma antal enheter.
SB_PAGELEFT Användaren klickar på rullningslistaxeln till vänster om rullningsrutan. Minskar rullningsrutans position med antalet dataenheter i fönstret. Rullar mot den vänstra änden av data med samma antal enheter.
SB_PAGERIGHT Användaren klickar på rullningslistaxeln till höger om rullningsrutan. Ökar rullningsrutans position med antalet dataenheter i fönstret. Rullar mot den högra kanten av datan med samma antal enheter.
SB_THUMBPOSITION Användaren släpper rullningsrutan när den har dragits. Anger rullningsrutan till den position som anges i meddelandet. rullar data med samma antal enheter som rullningsrutan har flyttat.
SB_THUMBTRACK Användaren drar rullningsrutan. Anger rullningsboxen till den position som anges i meddelandet och rullar data med samma antal enheter som rullningsboxen har flyttat för applikationer som snabbt renderar data. Program som inte kan rita data snabbt måste vänta på SB_THUMBPOSITION-begärandekoden innan man flyttar scroll-boxen och rullar data.
SB_ENDSCROLL Användaren släpper musen efter att ha hållit den på en pil eller i rullningslistaxeln. Inget svar behövs.

 

En rullningslist genererar SB_THUMBPOSITION och SB_THUMBTRACK begärandekod när användaren klickar och drar rullningsrutan. Ett program ska programmeras för att bearbeta antingen SB_THUMBTRACK eller SB_THUMBPOSITION begärandekod.

Begärandekoden SB_THUMBPOSITION kommer efter att användaren släppt musknappen efter att ha klickat på rullningsrutan. Ett program som bearbetar det här meddelandet utför rullningsåtgärden när användaren har dragit rullningsrutan till önskad position och släppt musknappen.

Begärandekoden SB_THUMBTRACK inträffar när användaren drar skjutreglaget. Om ett program bearbetar SB_THUMBTRACK begärandekoder kan det rulla innehållet i ett fönster när användaren drar rullningsrutan. En rullningslist kan dock generera många SB_THUMBTRACK begärandekod på kort tid, så ett program bör endast bearbeta dessa begärandekoder om det snabbt kan måla om innehållet i fönstret.

Tangentbordsgränssnitt för en rullningslist

En rullningslistkontroll ger ett inbyggt tangentbordsgränssnitt som gör det möjligt för användaren att utfärda rullningsbegäranden med hjälp av tangentbordet. En vanlig rullningslist gör inte det. När en rullningslistkontroll har tangentbordsfokus skickar den WM_HSCROLL och WM_VSCROLL meddelanden till det överordnade fönstret när användaren trycker på piltangenterna. Begärandekoden skickas med varje meddelande som motsvarar piltangenten som användaren har tryckt på. Följande är piltangenterna och deras motsvarande begärandekoder.

Piltangent Begär kod
NER SB_LINEDOWN eller SB_LINERIGHT
ÄNDE SB_BOTTOM
HEM SB_TOP
VÄNSTER SB_LINEUP eller SB_LINELEFT
PGDN SB_PAGEDOWN eller SB_PAGERIGHT
PGUP SB_PAGEUP eller SB_PAGELEFT
HÖGER SB_LINEDOWN eller SB_LINERIGHT
UPP SB_LINEUP eller SB_LINELEFT

 

 

Anteckning

Tangentbordsgränssnittet för en rullningslistkontroll skickar SB_TOP och SB_BOTTOM koder för begäran. Koden för SB_TOP begäran anger att användaren har nått det högsta värdet för rullningsintervallet. Ett program rullar ned fönsterinnehållet så att dataobjektets överkant visas. Koden för SB_BOTTOM begäran anger att användaren har nått det nedre värdet för rullningsintervallet. Om ett program bearbetar SB_BOTTOM kod för begäran rullar det fönsterinnehållet uppåt så att dataobjektets nederkant visas.

 

Om du vill ha ett tangentbordsgränssnitt för en vanlig rullningslist kan du skapa ett själv genom att bearbeta WM_KEYDOWN meddelandet i fönsterproceduren och sedan utföra lämplig rullningsåtgärd baserat på den virtuella nyckelkod som medföljer meddelandet. Information om hur du skapar ett tangentbordsgränssnitt för en rullningslist finns i Skapa ett tangentbordsgränssnitt för en standardrullningslist.

Rulla klientområdet

Det enklaste sättet att rulla innehållet i ett klientområde är att radera och sedan rita om det. Det här är den metod som ett program sannolikt använder med SB_PAGEUP, SB_PAGEDOWN och SB_TOP begärandekoder, som vanligtvis kräver helt nytt innehåll.

För vissa begärandekoder, till exempel SB_LINEUP och SB_LINEDOWN, behöver inte allt innehåll raderas, eftersom vissa förblir synliga när rullningen har inträffat. Funktionen ScrollWindowEx bevarar en del av klientområdets innehåll, flyttar den bevarade delen en angiven mängd och förbereder sedan resten av klientområdet för att måla ny information. ScrollWindowEx använder funktionen BitBlt för att flytta en viss del av dataobjektet till en ny plats i klientområdet. Alla oskyddade delar av klientområdet (allt som inte bevaras) ogiltigförklaras, raderas och målas när nästa WM_PAINT meddelande inträffar.

Funktionen ScrollWindowEx kan användas för att undanta en del av klientområdet från rullningsåtgärden. Detta hindrar objekt med fasta positioner, till exempel barnfönster, från att flyttas inom klientytan. Den ogiltigförklarar automatiskt den del av klientområdet som ska ta emot den nya informationen, så programmet behöver inte beräkna sina egna urklippsregioner. För mer information om klippning, se Klippning.

Vanligtvis rullar ett program innehållet i ett fönster i motsatt riktning som indikeras av rullningslisten. När användaren till exempel klickar på rullningslistaxeln i området under rullningsrutan rullar ett program objektet i fönstret uppåt för att visa en del av objektet som ligger under den synliga delen.

Du kan också rulla en rektangulär region med hjälp av funktionen ScrollDC.

Rullningslistens färger och mått

Det systemdefinierade färgvärdet, COLOR_SCROLLBAR, styr färgen i en rullningslistaxel. Använd funktionen GetSysColor för att fastställa färgen på rullningslistaxeln och funktionen SetSysColors för att ange färgen på rullningslistaxeln. Observera dock att den här färgändringen påverkar alla rullningslister i systemet.

Du kan hämta dimensionerna för de bitmappar som systemet använder i standardrullningslister genom att anropa funktionen GetSystemMetrics. Här följer de systemmåttvärden som är associerade med rullningslister.

Systemmått Beskrivning
SM_CXHSCROLL Pilbitmappens bredd på vågrätt rullningsfält
SM_CXHTHUMB Bredd på scrollboxen i vågrät scrollbar. Det här värdet avser bredden på en rullningslist som har en sidstorlek på noll.
SM_CXVSCROLL Bredden på pilens bitmap på den lodräta rullningslisten
SM_CYHSCROLL Höjd på pilbitmappen på vågrät rullningslist
SM_CYVSCROLL Höjd på pil-bitmap på vertikal rullningslist
SM_CYVTHUMB Rullningsrutans höjd på lodrät rullningslist. Det här värdet hämtar höjden på ett rullningsfält som har en sidstorlek på noll.