Om flikkontroller

En flikkontroll motsvarar avdelarna i en notebook-fil eller etiketterna i ett filskåp. Genom att använda en flikkontroll kan ett program definiera flera sidor för samma område i ett fönster eller en dialogruta. Varje sida består av en viss typ av information eller en grupp kontroller som programmet visar när användaren väljer motsvarande flik.

Följande skärmbild visar en enkel flikkontroll som innehåller flikar för veckodagar. Fliken Tisdag har valts.

skärmbild av ett egenskapsblad med fem flikar, en för varje dag i veckan

Det här avsnittet innehåller följande delar.

Skapa flikkontroller

Du kan skapa en flikkontroll genom att anropa funktionen CreateWindowEx och ange WC_TABCONTROL-fönsterklassen. Den här fönsterklassen registreras när den vanliga DLL-filen för kontroller läses in. Använd funktionen InitCommonControlsEx för att säkerställa att DLL:n läses in.

I Microsoft Visual Studio kan du skapa en flikkontroll med hjälp av verktygslådan.

Du skickar meddelanden till en flikkontroll för att lägga till flikar och på annat sätt påverka kontrollens utseende och beteende. Varje meddelande har ett motsvarande makro som du kan använda i stället för att uttryckligen skicka meddelandet. Du kan inte inaktivera en enskild flik i en flikkontroll. Du kan dock inaktivera en flikkontroll i ett egenskapsblad genom att inaktivera motsvarande sida.

Flikkontrollformat

Du kan använda vissa egenskaper för tabbkontroller genom att ange tabbkontrollformat när kontrollen skapas. Du kan till exempel ange justering och allmänt utseende för flikarna i en flikkontroll.

Du kan få flikarna att se ut som knappar genom att ange TCS_BUTTONS formatmall. Flikar i den här typen av flikkontroll bör fungera med samma funktion som knappkontroller. Att klicka på en flik bör alltså utföra ett kommando i stället för att visa en sida. Eftersom visningsområdet i en knappflikskontroll vanligtvis inte används, ritas ingen kantlinje runt den.

Du kan få en flik att ta emot fokus för inmatning när man klickar på den genom att ange stilen TCS_FOCUSONBUTTONDOWN. Det här formatet används vanligtvis endast med TCS_BUTTONS stil. Du kan ange att en flik inte får indatafokus när du klickar med hjälp av formatet TCS_FOCUSNEVER.

Som standard visar en flikkontroll endast en rad med flikar. Om inte alla flikar kan visas samtidigt visar flikkontrollen en upp-ned-kontroll så att användaren kan rulla ytterligare flikar i vyn. Du kan göra så att en flikkontroll visar flera rader med flikar om det behövs genom att ange TCS_MULTILINE formatmall. Med det här formatet kan alla flikar visas samtidigt. Flikarna är vänsterjusterade inom varje rad, om du inte anger TCS_RIGHTJUSTIFY stil. I det här fallet ökas bredden på varje flik så att varje rad med flikar fyller hela bredden på tabbkontrollen.

En flikkontroll storleksanpassar automatiskt varje flik så att den passar dess ikon, om någon, och dess etikett. Om du vill ge alla flikar samma bredd kan du ange TCS_FIXEDWIDTH formatmall. Kontrollen storleksanpassar alla flikar för att passa den bredaste etiketten, eller så kan du tilldela en specifik bredd och höjd med hjälp av TCM_SETITEMSIZE meddelande. På varje flik centrerar kontrollen ikonen och etiketten och placerar ikonen till vänster om etiketten. Du kan tvinga ikonen till vänster och lämna etiketten centrerad genom att ange TCS_FORCEICONLEFT formatmall. Du kan vänsterjustera både ikonen och etiketten med hjälp av TCS_FORCELABELLEFT stil. Du kan inte använda stilen TCS_FIXEDWIDTH med stilen TCS_RIGHTJUSTIFY.

Du kan ange att det överordnade fönstret ritar flikarna i kontrollen med hjälp av TCS_OWNERDRAWFIXED stil. Mer information finns i Owner-Drawn flikar.

Du kan ange att en flikkontroll ska skapa en knappbeskrivningskontroll genom att använda TCS_TOOLTIPS stil. Mer information om detta finns i Knappbeskrivningar för flikkontroll.

Flikar och tabbattribut

Varje flik i en flikkontroll består av en ikon, en etikett och programdefinierade data. Den här informationen anges av en TCITEM- struktur. Du kan lägga till flikar i en flikkontroll, hämta antalet flikar, hämta och ange innehållet på en flik och ta bort flikar. Flikar identifieras av deras nollbaserade index.

Om du vill lägga till flikar i en flikkontroll använder du meddelandet TCM_INSERTITEM och anger objektets position och adressen för en TCITEM- struktur. Du kan hämta och ange innehållet på en befintlig flik med hjälp av TCM_GETITEM och TCM_SETITEM meddelanden. För varje flik kan du ange en ikon, en etikett eller båda. Du kan också ange programdefinierade data som ska associeras med fliken.

Du kan hämta det aktuella antalet flikar med hjälp av meddelandet TCM_GETITEMCOUNT, ta bort en flik med hjälp av TCM_DELETEITEM-meddelandet och ta bort alla flikar i en flikkontroll med hjälp av TCM_DELETEALLITEMS meddelandet.

Du kan associera programdefinierade data med varje flik. Du kan till exempel spara information om varje sida med motsvarande flik. Som standard allokerar en flikkontroll fyra extra byte per flik för programdefinierade data. Du kan ändra antalet extra byte per flik med hjälp av meddelandet TCM_SETITEMEXTRA. Du kan bara använda det här meddelandet när flikkontrollen är tom.

Programdefinierade data anges av lParam medlem i TCITEM- struktur. Om du använder mer än 4 byte programdefinierade data måste du definiera din egen struktur och använda den i stället för TCITEM-. Du kan hämta och ange programdefinierade data på samma sätt som du hämtar och anger annan information om en flik med hjälp av TCM_GETITEM och TCM_SETITEM meddelanden.

Den första medlemmen i din struktur måste vara en TCITEMHEADER- struktur, och de återstående medlemmarna måste ange programdefinierade data. TCITEMHEADER är identisk med TCITEM-, förutom att den inte har lParam- medlem. Skillnaden mellan strukturens storlek och storleken på TCITEMHEADER ska vara lika med antalet extra byte per flik.

Visningsområde

Visningsområdet för en flikkontroll är det område där ett program visar den aktuella sidan. Vanligtvis skapar ett program ett underordnat fönster eller en dialogruta som anger fönstrets storlek och position så att det passar visningsområdet. Med tanke på fönstrets rektangel för en flikkontroll kan du beräkna avgränsningsrektangeln för visningsområdet med hjälp av meddelandet TCM_ADJUSTRECT.

Ibland måste visningsområdet vara en viss storlek, till exempel storleken på en modellös underordnad dialogruta. Med tanke på avgränsningsrektangeln för visningsområdet kan du använda TCM_ADJUSTRECT för att beräkna motsvarande fönsterrektangel för tabbkontrollen.

Flikval

När användaren väljer en flik skickar en flikkontroll sina överordnade fönsteraviseringskoder i form av WM_NOTIFY meddelanden. TCN_SELCHANGING-meddelandekoden skickas innan markeringen ändras och TCN_SELCHANGE meddelandekoden skickas efter att markeringen har ändrats.

Du kan bearbeta TCN_SELCHANGING för att spara tillståndet för den utgående sidan. Du kan returnera TRUE- för att förhindra att markeringen ändras. Du kanske till exempel inte vill växla bort från en underordnad dialogruta där en kontroll har en ogiltig inställning.

Du måste bearbeta TCN_SELCHANGE för att visa den inkommande sidan i visningsområdet. Detta kan helt enkelt innebära att den information som visas i ett underordnat fönster ändras. Oftare består varje sida av ett underordnat fönster eller en dialogruta. I det här fallet kan ett program bearbeta det här meddelandet genom att förstöra eller dölja det utgående underordnade fönstret eller dialogrutan och genom att skapa eller visa det inkommande underordnade fönstret eller dialogrutan.

Du kan hämta och ange den aktuella markeringen med hjälp av TCM_GETCURSEL och TCM_SETCURSEL meddelanden.

Flikkontrollbildlistor

Varje flik kan ha en ikon associerad med den, som anges av ett index i bildlistan för flikkontrollen. När en flikkontroll skapas har den ingen associerad bildlista. Ett program kan skapa en avbildningslista med hjälp av funktionen ImageList_Create och sedan tilldela den till en flikkontroll med hjälp av meddelandet TCM_SETIMAGELIST.

Du kan lägga till bilder i en flikkontrolls bildlista precis som i andra bildlistor. Ett program bör dock ta bort bilder med hjälp av TCM_REMOVEIMAGE-meddelandet i stället för funktionen ImageList_Remove. Det här meddelandet ser till att varje flik förblir associerad med samma bild som tidigare.

Om du förstör en flikkontroll förstörs inte en bildlista som är associerad med den. Du måste förstöra bildlistan separat. Det här är användbart om du vill tilldela samma bildlista till flera flikkontroller.

Om du vill hämta handtaget till den bildlista som för närvarande är associerad med en flikkontroll kan du använda meddelandet TCM_GETIMAGELIST.

Flikstorlek och position

Varje flik i en flikkontroll har en storlek och position. Du kan ange storleken på flikar, hämta avgränsningsrektangeln på en flik eller bestämma vilken flik som är på en angiven position.

För kontroller med fast bredd och ägarritade flikar kan du ange den exakta bredden och höjden på flikarna med hjälp av TCM_SETITEMSIZE meddelandet. I andra flikkontroller beräknas varje fliks storlek baserat på ikonen och etiketten för fliken. Tabbkontrollen innehåller utrymme för en kantlinje och en extra marginal. Du kan ange tjockleken på marginalen med hjälp av meddelandet TCM_SETPADDING.

Du kan fastställa den aktuella avgränsningsrektangeln för en flik med hjälp av meddelandet TCM_GETITEMRECT. Du kan avgöra vilken flik som finns på en angiven plats med hjälp av meddelandet TCM_HITTEST.

I en flikkontroll med formatmallen TCS_MULTILINE kan du fastställa det aktuella antalet rader med flikar med hjälp av TCM_GETROWCOUNT meddelande.

Owner-Drawn flikar

Om en flikkontroll har TCS_OWNERDRAWFIXED formatmall måste det överordnade fönstret måla flikar genom att bearbeta WM_DRAWITEM meddelandet. Tabbkontrollen skickar det här meddelandet när en flik behöver målas. Parametern lParam anger adressen för en DRAWITEMSTRUCT- struktur, som innehåller indexet för fliken, dess avgränsningsrektangel och den enhetskontext (DC) som används för att rita.

Som standard innehåller itemData medlem i DRAWITEMSTRUCT värdet för lParam medlem i TCITEM- struktur. Men om du ändrar den mängd av programdefinierade data per flik, innehåller itemData adressen till data i stället. Du kan ändra mängden programdefinierade data per flik med hjälp av meddelandet TCM_SETITEMEXTRA.

Om du vill ange storleken på objekten i en flikkontroll måste det överordnade fönstret bearbeta WM_MEASUREITEM meddelandet. Eftersom alla flikar i en ägarritad flikkontroll har samma storlek skickas det här meddelandet bara en gång. Det finns inget flikkontrollformat för ägarritade flikar av varierande storlek. Du kan också ange flikarnas bredd och höjd med hjälp av TCM_SETITEMSIZE meddelande.

Verktygstips för flikkontroll

Du kan använda en verktygstipskontroll för att ge en kort beskrivning av varje flik i en flikkontroll. En flikkontroll som har TCS_TOOLTIPS stil skapar en verktygstipskontroll när den skapas och förstör verktygstipskontrollen när den förstörs. Du kan också skapa en verktygstipskontroll och tilldela den till en flikkontroll.

Om du använder en verktygstipskontroll med en flikkontroll måste det överordnade fönstret bearbeta TTN_GETDISPINFO meddelandekod för att ange en beskrivning av varje flik på begäran.

Om du vill använda samma knappbeskrivningskontroll med mer än en flikkontroll skapar du knappbeskrivningskontrollen själv och tilldelar den till flikkontrollen med hjälp av TCM_SETTOOLTIPS-meddelandet. Du kan hämta handtaget till en flikkontrolls aktuella knappbeskrivningskontroll med hjälp av TCM_GETTOOLTIPS-meddelandet. Om du skapar en egen verktygstipskontroll bör du inte använda TCS_TOOLTIPS stilen.

Standard flikkontrollsmeddelandebearbetning

I det här avsnittet beskrivs den meddelandebearbetning som utförs av en flikkontroll. Meddelanden som är specifika för tabbkontroller beskrivs i andra avsnitt i den här dokumentationen.

Meddelande Bearbetningen har utförts
WM_CAPTURECHANGED Gör inget när flikkontrollen släpper musfångsten. Om ett annat fönster fångade musen och en knapp hålls ned släpper kommandot knappen.
WM_CREATE Allokerar och initierar en intern datastruktur. Kontrollen skapar en knappbeskrivningskontroll om TCS_TOOLTIPS formatmall har angetts.
WM_DESTROY Frigör resurser som allokerats under WM_CREATE hantering.
WM_GETDLGCODE Returnerar en kombination av värdena DLGC_WANTARROWS och DLGC_WANTCHARS.
WM_GETFONT Returnerar handtaget till det teckensnitt som används för etiketter.
WM_KEYDOWN Bearbetar riktningsnycklar och ändrar markeringen, om det är lämpligt.
WM_KILLFOCUS Avaktiverar den flik som har fokus så att den ommålas för att återspegla att den inte har fokus.
WM_LBUTTONDOWN Vidarebefordrar meddelandet till verktygstipskontrollen, om någon, och ändrar markeringen om användaren klickar på en flik. Om användaren klickar på en knapp, ritar kontrollen om knappen för att ge ett intryckt utseende och fångar musen. Om användaren klickar på antingen en flik eller knapp och TCS_FOCUSONBUTTONDOWN stil anges, ställer kontrollen in fokus på sig själv.
WM_LBUTTONUP Släpper musen om en knapp trycktes in. Om markören är över knappen och hålls nere ändrar kontrollen markeringen i enlighet med detta och ritar om knappen.
WM_MOUSEMOVE Vidarebefordrar meddelandet till verktygstipskontrollen, om det finns någon. Om TCS_BUTTONS formatmall anges och musknappen hålls ned efter att du har klickat kan kontrollen även rita om den berörda knappen för att ge den ett upphöjt eller nedsänkt utseende.
WM_NOTIFY Vidarebefordrar meddelandekoder som skickas av verktygstipskontrollen.
WM_PAINT Ritar en kantlinje runt visningsområdet (om inte TCS_BUTTONS formatmall anges) och målar alla flikar som korsar den ogiltiga rektangeln. För varje flik ritar den flikens brödtext (eller skickar ett WM_DRAWITEM meddelande till det överordnade fönstret) och ritar sedan en kantlinje runt fliken. Om parametern wParam inte är NULL förutsätter kontrollen att värdet är en HDC och målar med den enhetskontexten.
WM_RBUTTONDOWN Skickar en meddelandekod NM_RCLICK till det överordnade fönstret.
WM_SETFOCUS Inaktiverar den fokuserade fliken så att den ommålas för att återspegla ett fokuserat tillstånd.
WM_SETFONT Anger det teckensnitt som används för etiketter.
WM_SETREDRAW Anger tillståndet för en intern flagga som avgör om kontrollen ska målas om när objekt infogas och tas bort, när teckensnittet ändras och så vidare.
WM_SIZE Beräknar om flikarnas positioner och kan ogiltigförklara en del av tabbkontrollen för att framtvinga ommålning av vissa eller alla flikar.