Programmera en klass för att skapa en anpassad VB.NET-kontroll

Att bygga kompletta anpassade komponenter kan vara ett mycket avancerat projekt. Men du kan bygga en VB.NET-klass som har många av fördelarna med en verktygslådekomponent med mycket mindre ansträngning. Här är hur!

För att få en smak av vad du behöver göra för att skapa en komplett anpassad komponent, prova detta experiment:

-> Öppna ett nytt Windows-applikationsprojekt i VB.NET.
-> Lägg till en checkbox från verktygslådan i formuläret.
-> Klicka på knappen "Visa alla filer" längst upp i Lösningsutforskare.

Detta visar filerna som Visual Studio skapar för ditt projekt (så du behöver inte). Som en historisk fotnot gjorde VB6-kompilatorn mycket av samma saker, men du kunde aldrig få åtkomst till koden eftersom den begravdes i kompilerad "p-kod". Du kan också utveckla anpassade kontroller i VB6, men det var mycket svårare och krävde ett specialverktyg som Microsoft levererade just för detta ändamål.

I formuläret Designer.vb fil, kommer du att upptäcka att koden nedan har lagts till automatiskt på rätt platser för att stödja CheckBox-komponenten. (Om du har en annan version av Visual Studio kan din kod vara något annorlunda.) Det här är koden som Visual Studio skriver åt dig.

instagram viewer

'Krävs av Windows Form Designer Privata komponenter _ Som system. ComponentModel. IContainer'NOTE: Följande procedur krävs'av Windows Form Designer'Det kan ändras med Windows Form Designer. 'Ändra inte det med kodredigeraren. _Private Sub InitializeComponent () Me. CheckBox1 = Nytt system. Windows. Former. CheckBox () Jag. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = Sann mig. CheckBox1.Location = Nytt system. Teckning. Punkt (29, 28) Jag. CheckBox1.Name = "CheckBox1".. . och så vidare ...

Det här är koden som du måste lägga till i ditt program för att skapa en anpassad kontroll. Tänk på att alla metoder och egenskaper för den faktiska CheckBox-kontrollen är i en klass som tillhandahålls av .NET Framework: Systemet. Windows. Former. Kryssruta. Detta är inte en del av ditt projekt eftersom det är installerat i Windows för alla .NET-program. Men det finns en massa av det.

En annan punkt att vara medveten om är att om du använder WPF (Windows Presentation Foundation) kommer klassen .NET CheckBox från ett helt annat bibliotek med namnet Systemet. Windows. kontroller. Den här artikeln fungerar bara för en Windows Forms-applikation, men arvets huvudmän här fungerar för alla VB.NET-projekt.

Anta att ditt projekt behöver en kontroll som liknar en av standardkontrollerna. Till exempel en kryssruta som ändrade färg eller visade ett litet "lyckligt ansikte" istället för att visa den lilla "check" -grafiken. Vi kommer att bygga en klass som gör detta och visa dig hur du lägger till det i ditt projekt. Även om detta kan vara användbart i sig, är det verkliga målet att demonstrera VB.NET: s arv.

Låt oss börja kodning

För att komma igång, ändra namnet på CheckBox som du just har lagt till oldCheckBox. (Du kanske vill sluta visa "Visa alla filer" igen för att förenkla Solution Explorer.) Lägg nu till en ny klass i ditt projekt. Det finns flera sätt att göra detta, inklusive högerklicka på projektet i Solution Explorer och välja "Lägg till" och sedan "Klass" eller välja "Lägg till klass" under under menyposten Projekt. Ändra filnamnet för den nya klassen till newCheckBox att hålla saker raka. Slutligen öppnar du kodfönstret för klassen och lägger till den här koden:

Public Class newCheckBox Inherits CheckBox Private CenterSquareColor As Color = Color. Röda skyddade åsidosättningar Sub OnPaint (ByVal pEvent _ Som PaintEventArgs) Dim CenterSquare _ Som ny rektangel (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Kontrollerad sedan pEvent. Grafik. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class

(I den här artikeln och i andra på webbplatsen används många linjefortsättningar för att hålla linjerna korta så att de passar in i utrymmet som finns tillgängligt på webbsidan.)

Det första du märker om din nya klasskod är ärver nyckelord. Det betyder att alla egenskaper och metoder för en VB.NET Framework CheckBox automatiskt ingår i den här. För att uppskatta hur mycket arbete detta sparar måste du försöka programmera något som en CheckBox-komponent från grunden.

Det finns två viktiga saker att märka i koden ovan:

Den första är koden som används Åsidosätta att ersätta standard .NET-beteende som skulle äga rum för en OnPaint händelse. En OnPaint-händelse utlöses när Windows märker att en del av din skärm måste rekonstrueras. Ett exempel skulle vara när ett annat fönster avslöjar en del av din skärm. Windows uppdaterar skärmen automatiskt, men ringer sedan OnPaint-händelsen i din kod. (OnPaint-händelsen kallas också när formen ursprungligen skapades.) Så om vi åsidosätter OnPaint kan vi ändra hur saker ser ut på skärmen.

Det andra är hur Visual Basic skapar CheckBox. Varje gång föräldern är "Kontrollerad" (det vill säga Mig. Kontrollerade är Sann) då kommer den nya koden som vi tillhandahåller i vår NewCheckBox-klass att färgfärgas mitt i CheckBox istället för att rita ett bock.

Resten är det som kallas GDI + -kod. Den här koden väljer en rektangel med exakt samma storlek som mitten av en kryssruta och färgar in den med GDI + -metodsamtal. De "magiska siffrorna" för att placera den röda rektangeln, "rektangel (3, 4, 10, 12)" bestämdes experimentellt. Jag ändrade bara tills den såg rätt ut.

Det är ett mycket viktigt steg som du vill se till att du inte lämnar förfaranden för åsidosättande:

MyBase. OnPaint (pEvent)

Överskridande innebär att din kod kommer att tillhandahållas Allt av koden för händelsen. Men det är sällan det du vill ha. Så VB ger ett sätt att köra den normala .NET-koden som skulle ha körts för en händelse. Detta är uttalandet som gör det. Den överför samma parameter - pEvent - till händelsekoden som skulle ha körts om den inte hade åsidosatts, MyBase. OnPaint.

Använda den nya kontrollen

Eftersom vår nya kontroll inte finns i vår verktygslåda måste den skapas i form med kod. Det bästa stället att göra det är i formen Ladda händelseförfarande.

Öppna kodfönstret för proceduren för formbelastning och lägg till den här koden:

Privat sub frmCustCtrlEx_Load (ByVal avsändare som system. Objekt, ByVal e As System. EventArgs) Hanterar MyBase. Ladda Dim customCheckBox som ny newCheckBox () Med customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Vänster. Top = oldCheckBox. Top + oldCheckBox. Höjd. Storlek = Ny storlek (oldCheckBox. Storlek. Bredd + 50, oldCheckBox. Storlek. Höjd) Avsluta med kontroller. Lägg till (customCheckBox) End Sub

För att placera den nya kryssrutan på formuläret har vi utnyttjat det faktum att det redan finns en där och bara använt storleken och positionen för den (justerad så att egenskapen Text passar). Annars skulle vi behöva koda positionen manuellt. När MyCheckBox har lagts till i formuläret lägger vi sedan till det i kontrollsamlingen.

Men den här koden är inte så flexibel. Till exempel är färgen Röd hårkodad och för att ändra färgen krävs att programmet ändras. Du kanske också vill ha en grafik istället för en bock.

Här är en ny, förbättrad CheckBox-klass. Den här koden visar hur du tar några av de följande stegen mot VB.NET objektorienterad programmering.

Allmän klass bättreCheckBox Inherits CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Protected Overrides Sub OnPaint _ (ByVal pEvent As _ System). Windows. Former. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Kontrolleras sedan om CenterSquareImage är inget, sedan pEvent. Grafik. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Annars pEvent. Grafik. DrawImage (CenterSquareImage, CenterSquare) End If End Om End Sub Public Property FillColor () Som Color Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Value End Set End Property Public Property FillImage () Som Bitmap Få FillImage = CenterSquareImage End Get Set (ByVal Value As Bitmap) CenterSquareImage = Value End Set End PropertyEnd Klass

Varför BetterCheckBox-versionen är bättre

En av de viktigaste förbättringarna är tillägget av två Egenskaper. Detta är något som den gamla klassen inte gjorde alls.

De två nya fastigheterna som introduceras är

Fyllnadsfärg

och

FillImage

För att få en smak av hur detta fungerar i VB.NET, prova detta enkla experiment. Lägg till en klass i ett standardprojekt och ange sedan koden:

Offentlig egendom oavsett vad som får

När du trycker på Enter efter att du har skrivit "Hämta" fyller VB.NET Intellisense i hela egenskapskodblocket och allt du behöver göra är att koda specifikationerna för ditt projekt. (Get and Set-blocken behöver inte alltid börja med VB.NET 2010, så du måste åtminstone berätta för Intellisense så mycket för att starta det.)

Offentlig egendom oavsett Get End Get Set (ByVal-värde) End SetEnd Property

Dessa block har slutförts i koden ovan. Syftet med dessa kodblock är att tillåta tillgång till fastighetsvärden från andra delar av systemet.

Med tillägg av metoder, skulle du vara på god väg att skapa en komplett komponent. För att se ett mycket enkelt exempel på en metod lägger du till den här koden under egendomsdeklarationerna i klassen betterCheckBox:

Public Sub Betona () Me. Teckensnitt = Nytt system. Teckning. Teckensnitt (_ "Microsoft Sans Serif", 12.0!, _ System. Teckning. Typsnitt. Fet) Jag. Storlek = Nytt system. Teckning. Storlek (200, 35) CenterSquare. Offset (CenterSquare. Vänster - 3, CenterSquare. Top + 3) End Sub

Förutom att justera teckensnittet som visas i en CheckBox, justerar denna metod också storleken på rutan och platsen för den markerade rektangeln för att ta hänsyn till den nya storleken. Om du vill använda den nya metoden kodar du bara det på samma sätt som du vill använda någon metod:

MyBetterEmphasizedBox. Betona()

Och precis som Egenskaper lägger Visual Studio automatiskt till den nya metoden i Microsofts Intellisense!

Huvudmålet här är att helt enkelt visa hur en metod kodas. Du kanske är medveten om att en standard CheckBox-kontroll också tillåter att teckensnittet ändras, så den här metoden tillför inte riktigt mycket funktion.

Nästa artikel i denna serie, Programmering av en anpassad VB.NET Control - Beyond the Basics!, visar en metod som gör det och förklarar också hur man åsidosätter en metod i en anpassad kontroll.