Dela via


Om rubrikkontroller

En rubrikkontroll är ett fönster som vanligtvis placeras ovanför kolumner med text eller siffror. Den innehåller en rubrik för varje kolumn och kan delas in i delar. Användaren kan dra de avdelare som separerar delarna för att ange bredden på varje kolumn. Följande bild visar en rubrikkontroll med etiketterade kolumner som ger detaljerad information om filer i en katalog.

skärmbild av en dialogruta med en rubrikkontroll med tre kolumner

Du kan skapa en rubrikkontroll med hjälp av funktionen CreateWindowEx och ange WC_HEADER-fönsterklassen och lämpliga rubrikkontrollformat. Den här fönsterklassen registreras när den vanliga DLL-filen för kontroll läses in. Använd funktionen InitCommonControlsEx för att säkerställa att DLL:n läses in. När du har skapat en rubrikkontroll kan du dela upp den i delar, ange texten i varje del och kontrollera fönstrets utseende med hjälp av sidhuvudfönstermeddelanden.

En rubrikkontroll kan skapas som ett underordnat fönster i en annan kontroll, till exempel en listruta. Den överordnade kontrollen känner dock inte till rubrikkontrollen och beaktar inte det utrymme som rubriken tar upp, vilket resulterar i att listobjekt visas bakom rubriken. Om du vill använda en rubrikkontroll i en listruta eller annan kontroll måste den överordnade kontrollen vara ägarritad så att alla objekt visas i rätt position.

Listvisningskontroller har redan rubrikkontroller. I stället för att skapa en rubrikkontroll för en listvykontroll använder du LVM_GETHEADER eller ListView_GetHeader för att hämta den befintliga kontrollen.

Storlek och position för rubrikkontroll

Vanligtvis måste du ange storlek och position för en rubrikkontroll så att den passar inom gränserna för en viss rektangel, till exempel klientområdet i ett fönster. Med hjälp av meddelandet HDM_LAYOUT kan du hämta lämpliga storleks- och positionsvärden från rubrikkontrollen.

När du skickar HDM_LAYOUTanger du adressen till en HDLAYOUT- struktur som innehåller koordinaterna för den rektangel som rubrikkontrollen ska uppta och ger en pekare till en WINDOWPOS- struktur. Kontrollen fyller WINDOWPOS- struktur med storleks- och positionsvärden som är lämpliga för att placera kontrollen längst upp i den angivna rektangeln. Höjdvärdet är summan av höjderna för kontrollens vågräta kantlinjer och den genomsnittliga höjden på tecken i teckensnittet som för närvarande är markerat i kontrollens enhetskontext.

Om du vill använda HDM_LAYOUT för att ange den inledande storleken och positionen för en rubrikkontroll anger du kontrollens inledande synlighetstillstånd så att det döljs. När du har skickat HDM_LAYOUT för att hämta storleks- och positionsvärdena kan du använda funktionen SetWindowPos för att ange den nya storleken, positionen och synlighetstillståndet.

Föremål

En rubrikkontroll har vanligtvis flera rubrikobjekt som definierar kolumnerna i kontrollen. Du lägger till ett objekt i en rubrikkontroll genom att skicka HDM_INSERTITEM-meddelandet till kontrollen. Meddelandet innehåller adressen till en HDITEM- struktur. Den här strukturen definierar egenskaperna för rubrikobjektet, som kan innehålla en sträng, en bitmappad bild, en initial storlek och en programdefinierad LPARAM- värde.

Den fmt- medlem i ett objekts HDITEM- struktur kan innehålla antingen flaggan HDF_STRING eller HDF_BITMAP för att ange om kontrollen visar objektets sträng eller bitmapp. Om du vill visa både en sträng och en bitmapp skapar du ett ägarritat objekt genom att ange fmt-medlem som ska innehålla flaggan HDF_OWNERDRAW. Den HDITEM- strukturen anger också formateringsflaggor som talar om för kontrollen om du vill centrera, vänsterjustera eller högerjustera strängen eller bitmappen i objektets rektangel.

HDM_INSERTITEM returnerar indexet för det nyligen tillagda objektet. Du kan använda indexet i andra meddelanden för att ange egenskaper eller hämta information om objektet. Du kan ta bort ett objekt med hjälp av meddelandet HDM_DELETEITEM och ange indexet för objektet som ska tas bort.

Du kan använda meddelandet HDM_SETITEM för att ange egenskaperna för ett befintligt rubrikobjekt och HDM_GETITEM meddelande för att hämta de aktuella egenskaperna för ett objekt. Om du vill hämta antalet objekt i en rubrikkontroll använder du meddelandet HDM_GETITEMCOUNT.

Owner-Drawn rubrikkontroller

Du kan definiera enskilda objekt i en rubrikkontroll som ägarritade objekt. Med den här tekniken får du mer kontroll än du annars skulle ha över utseendet på ett rubrikobjekt.

Du kan använda meddelandet HDM_INSERTITEM för att infoga ett nytt ägardraget objekt i en rubrikkontroll eller HDM_SETITEM meddelande för att ändra ett befintligt objekt till ett ägarritade objekt. Båda meddelandena innehåller adressen till en HDITEM- struktur, som ska ha fmt- medlem inställd på HDF_OWNERDRAW-värdet.

När en rubrikkontroll måste rita ett ägardraget objekt skickar den WM_DRAWITEM meddelandet till det överordnade fönstret. Parametern wParam i meddelandet är den underordnade fönsteridentifieraren för rubrikkontrollen, och parametern lParam är en adress för en DRAWITEMSTRUCT- struktur. Det överordnade fönstret använder informationen i strukturen för att rita objektet. För ett ägarritad objekt i en rubrikkontroll innehåller DRAWITEMSTRUCT--strukturen följande information.

Medlem Beskrivning
CtlType ODT_HEADER självritad kontrolltyp.
CtlID Identifierare för underordnat fönster i huvudkontrollen.
itemID Index för det objekt som ska ritas.
itemAction ODA_DRAWENTIRE ritningsåtgärdsflagga.
objekttillstånd ODS_SELECTED ritningsåtgärdsflagga om markören är över objektet och musknappen är tryckt ned. Annars är den här medlemmen noll.
hwndItem Handtag till rubrikkontrollen.
hDC Hantera till enhetskontexten för rubrikkontrollen.
rcItem Koordinater för rubrikobjektet som ska ritas. Koordinaterna är relativa till det övre vänstra hörnet i rubrikkontrollen.
itemData Programdefinierat 32-bitarsvärde som är associerat med objektet.

 

Filter för rubrikkontroll

Genom att ange HDS_FILTERBAR fönsterformat för en rubrikkontroll kan du aktivera placeringen av filterredigeringsrutor under kolumnrubrikerna. En filterknapp visas bredvid redigeringsrutan. Du kan implementera filtrering genom att svara på HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICKeller HDN_FILTERCHANGE aviseringskoder.

Som standard innehåller redigeringsrutan en uppmaning till användaren att ange text. Du kan återställa redigeringsrutan till det här standardtillståndet med hjälp av Header_ClearFilter eller Header_ClearAllFilters.

I följande kodexempel visas hur du hämtar rubrikkontrollen från en listvykontroll och lägger till ett filterfält.

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Standardbearbetning av meddelande för rubrikkontroll

I det här avsnittet beskrivs de fönstermeddelanden som hanteras av fönsterproceduren för WC_HEADER-fönsterklassen.

Meddelande Bearbetningen har utförts
WM_CREATE Initierar rubrikkontrollen.
WM_DESTROY Uninitialiserar rubrikkontrollen.
WM_ERASEBKGND Fyller bakgrunden i rubrikkontrollen med hjälp av kontrollens aktuella bakgrundsfärg.
WM_GETDLGCODE Returnerar en kombination av värdena DLGC_WANTTAB och DLGC_WANTARROWS.
WM_GETFONT Returnerar handtaget till det aktuella teckensnittet, som används av rubrikkontrollen för att visa dess text.
WM_LBUTTONDBLCLK Fångar musinput. Om musmarkören finns på en avdelare skickar kontrollen meddelandekoden HDN_BEGINTRACK och börjar dra avdelaren. Om markören finns på ett objekt visas objektet i det pressade tillståndet.
WM_LBUTTONDOWN Samma som meddelandet WM_LBUTTONDBLCLK.
WM_LBUTTONUP Släpper musfångstet. Om kontrollen spårade musflytten skickar den HDN_ENDTRACK-meddelandekoden och ritar om rubrikkontrollen. Annars skickar kontrollen meddelandekoden HDN_ITEMCLICK och ritar upp rubrikobjektet på nytt som klickades.
WM_MOUSEMOVE Om en avdelare dras, skickar kontrollen meddelandekoden HDN_TRACK och visar objektet på den nya positionen. Om den vänstra musknappen är nere och markören finns på ett objekt visas objektet i nedtryckt tillstånd.
WM_NCCREATE Allokerar och initierar en intern datastruktur.
WM_NCDESTROY Frigör de resurser som allokerats av rubrikkontrollen när rubrikkontrollen är avinitialiserad.
WM_PAINT Målar upp den ogiltiga regionen för rubrikkontrollen. Om parametern wParam inte är NULL förutsätter kontrollen att värdet är en HDC och målar med den enhetskontexten.
WM_SETCURSOR Anger markörformen, beroende på om markören finns på en avdelare eller i ett rubrikobjekt.
WM_SETFONT Väljer ett nytt teckensnittshandtag i enhetskontexten för rubrikkontrollen.