Dela via


Kontroller med stöd för Built-In Owner-Drawing

Egenritning i Windows Forms, som även kallas anpassad ritning, är en teknik för att ändra det grafiska utseendet på vissa kontroll-element.

Notera

Ordet "kontroll" i det här avsnittet används för att betyda klasser som härleds från antingen Control eller Component.

Vanligtvis hanterar Windows målning automatiskt med hjälp av egenskapsinställningar som BackColor för att fastställa utseendet på en kontroll. Med ägarritning tar du över ritprocessen och ändrar de visuella detaljer som inte kan ändras genom egenskaper. Med många kontroller kan du till exempel ange färgen på texten som visas, men du är begränsad till en enda färg. Med ägarritning kan du göra saker som att bestämma att en del av texten visas i svart och en del i rött.

I praktiken liknar ritning som ägare att rita grafik på ett formulär. Du kan till exempel använda grafikmetoder i en hanterare för formulärets Paint händelse för att emulera en ListBox kontroll, men du måste skriva din egen kod för att hantera all användarinteraktion. När kontrollen har ritning av ägare använder den din kod för att rita upp innehållet, men behåller annars alla sina inbyggda funktioner. Du kan använda grafikmetoder för att rita varje objekt i kontrollen eller för att anpassa vissa aspekter av varje objekt medan du använder standardutseendet för andra aspekter av varje objekt.

Användardefinierad ritning i Windows Forms-kontroller

Om du vill utföra ägarritning i kontroller som stöder den anger du vanligtvis en egenskap och hanterar en eller flera händelser.

De flesta kontroller som stöder ägarritning har en egenskap OwnerDraw eller DrawMode som anger om kontrollen utlöser sin ritrelaterade händelse eller händelser när den ritar sig själv.

Kontroller som inte har en OwnerDraw- eller DrawMode-egenskap inkluderar DataGridView-kontrollen, som tillhandahåller ritningshändelser som inträffar automatiskt, och ToolStrip-kontrollen, som ritas med hjälp av en extern återgivningsklass som har sina egna ritningsrelaterade händelser.

Det finns många olika typer av ritningshändelser, men en typisk ritningshändelse inträffar för att rita ett enda objekt inom en kontroll. Händelsehanteraren tar emot ett EventArgs objekt som innehåller information om objektet som ritas och verktyg som du kan använda för att rita det. Det här objektet innehåller till exempel vanligtvis objektets indexnummer i den överordnade samlingen, en Rectangle som anger objektets visningsgränser och ett Graphics objekt för att anropa färgmetoder. För vissa händelser innehåller EventArgs-objektet ytterligare information om det objekt och de metoder som du kan anropa för att måla vissa aspekter av objektet som standard, till exempel bakgrunden eller en fokusrektangel.

Om du vill skapa en återanvändbar kontroll som innehåller dina ägarskapade anpassningar skapar du en ny klass som härleds från en kontrollklass som stöder ägarritning. I stället för att hantera ritningshändelser, inkludera din ägarritningskod i åsidosättningar för den lämpliga OnEventName-metoden eller metoderna i den nya klassen. Kontrollera att du anropar basklassens OnEventName-metod eller -metoder i detta fall så att användare av ditt kontroll kan hantera ägarritade händelser och tillhandahålla ytterligare anpassning.

Följande Windows Forms-kontroller stöder ägarritad teckning i alla versioner av .NET Framework.

Följande kontroller stöder endast ägarritning i .NET Framework 2.0:

Följande kontroller stöder ägarritning och är nya i .NET Framework 2.0:

Följande avsnitt innehåller ytterligare information om var och en av dessa kontroller.

ListBox- och ComboBox-kontroller

Med kontrollerna ListBox och ComboBox kan du rita enskilda objekt i kontrollen antingen i en storlek eller i varierande storlekar.

Notera

Även om kontrollen CheckedListBox är härledd från kontrollen ListBox, saknar den stöd för anpassad ritning av ägaren.

Om du vill rita varje objekt i samma storlek anger du egenskapen DrawMode till OwnerDrawFixed och hanterar händelsen DrawItem.

Om du vill rita varje objekt med en annan storlek anger du egenskapen DrawMode till OwnerDrawVariable och hanterar både MeasureItem- och DrawItem-händelser. Med händelsen MeasureItem kan du ange storleken på ett objekt innan DrawItem händelsen inträffar för objektet.

Mer information, inklusive kodexempel, finns i följande avsnitt:

Komponenten MenuItem representerar ett enda menyalternativ i en MainMenu- eller ContextMenu komponent.

För att rita en MenuItem, sätt dess egenskap OwnerDraw till true och hantera dess händelse DrawItem. Om du vill anpassa storleken på menyalternativet innan händelsen DrawItem inträffar hanterar du objektets MeasureItem händelse.

Mer information, inklusive kodexempel, finns i följande referensavsnitt:

TabControl-kontroll

Med kontrollen TabControl kan du rita enskilda flikar i kontrollen. Ägarritningen påverkar bara flikarna; innehållet i TabPage påverkas inte.

Om du vill rita varje flik i en TabControlanger du egenskapen DrawMode till OwnerDrawFixed och hanterar händelsen DrawItem. Den här händelsen inträffar bara en gång för varje flik när fliken visas i kontrollen.

Mer information, inklusive kodexempel, finns i följande referensavsnitt:

Tooltip-komponent

Med komponenten ToolTip kan du rita hela verktygstipset när det visas.

Om du vill rita en ToolTipanger du dess egenskap OwnerDraw till true och hanterar dess Draw händelse. Om du vill anpassa storleken på ToolTip innan händelsen Draw inträffar hanterar du händelsen Popup och anger egenskapen ToolTipSize i händelsehanteraren.

Mer information, inklusive kodexempel, finns i följande referensavsnitt:

ListView-kontroll

Med kontrollen ListView kan du rita enskilda objekt, underobjekt och kolumnrubriker.

Om du vill aktivera ägarstyrd ritning i kontrollenheten anger du egenskapen OwnerDraw som true.

Om du vill rita varje objekt i kontrollen hanterar du händelsen DrawItem.

Om du vill rita varje underelement eller kolumnrubrik i kontrollen när egenskapen View är inställd på Details, hanterar du händelserna DrawSubItem och DrawColumnHeader.

Mer information, inklusive kodexempel, finns i följande referensavsnitt:

TreeView-kontroll

Med kontrollen TreeView kan du rita enskilda noder i kontrollen.

Om du bara vill rita texten som visas i varje nod anger du egenskapen DrawMode till OwnerDrawText och hanterar händelsen DrawNode för att rita texten.

Om du vill rita alla element i varje nod anger du egenskapen DrawMode till OwnerDrawAll och hanterar händelsen DrawNode för att rita de element du behöver, till exempel text, ikoner, kryssrutor, plus- och minustecken och linjer som ansluter noderna.

Mer information, inklusive kodexempel, finns i följande referensavsnitt:

DataGridView-kontroll

Med kontrollen DataGridView kan du rita enskilda celler och rader i kontrollen.

Om du vill rita enskilda celler hanterar du händelsen CellPainting.

Om du vill rita enskilda rader eller element i rader hanterar du en eller båda RowPrePaint och RowPostPaint händelser. Den RowPrePaint händelsen inträffar innan cellerna i en rad målas och den RowPostPaint händelsen inträffar när cellerna har målats. Du kan hantera både händelser och den CellPainting händelsen för att måla radbakgrund, enskilda celler och radförgrund separat, eller så kan du ange specifika anpassningar där du behöver dem och använda standardvisningen för andra element i raden.

Mer information, inklusive kodexempel, finns i följande avsnitt:

ToolStrip-kontroll

ToolStrip och härledda kontroller gör det möjligt för dig att anpassa alla aspekter av deras utseende.

Om du vill tillhandahålla anpassad rendering för ToolStrip kontroller anger du egenskapen Renderer för en ToolStrip, ToolStripManager, ToolStripPaneleller ToolStripContentPanel till ett ToolStripRenderer objekt och hanterar en eller flera av de många ritningshändelser som tillhandahålls av klassen ToolStripRenderer. Alternativt kan du ange en egenskap för Renderer till en instans av din egen klass som härleds från ToolStripRenderer, ToolStripProfessionalRenderereller ToolStripSystemRenderer som implementerar eller åsidosätter specifika OnEventName- metoder.

Mer information, inklusive kodexempel, finns i följande avsnitt:

Se även