Programmering af en klasse til oprettelse af en tilpasset VB.NET-kontrol

click fraud protection

At opbygge komplette tilpassede komponenter kan være et meget avanceret projekt. Men du kan opbygge en VB.NET-klasse, der har mange af fordelene ved en værktøjskassekomponent med langt mindre indsats. Sådan gør du!

For at få en smag af, hvad du skal gøre for at oprette en komplet tilpasset komponent, skal du prøve dette eksperiment:

-> Åbn et nyt Windows-applikationsprojekt i VB.NET.
-> Tilføj en CheckBox fra værktøjskassen til formularen.
-> Klik på knappen "Vis alle filer" øverst på Løsning Explorer.

Dette viser de filer, som Visual Studio opretter til dit projekt (så du ikke behøver det). Som en historisk fodnote gjorde VB6-kompilatoren meget af de samme ting, men du kunne aldrig få adgang til koden, fordi den blev begravet i kompileret "p-kode". Du kunne også udvikle brugerdefinerede kontroller i VB6, men det var meget vanskeligere og krævede et specialværktøj, som Microsoft leverede netop til det formål.

I formularen Designer.vb fil, vil du opdage, at nedenstående kode automatisk er tilføjet de rigtige placeringer til understøttelse af CheckBox-komponenten. (Hvis du har en anden version af Visual Studio, kan din kode muligvis være lidt anderledes.) Dette er den kode, som Visual Studio skriver til dig.

instagram viewer

'Krævet af Windows Form Designer Private komponenter _ Som system. ComponentModel. IContainer'NOTE: Følgende procedure er påkrævet'af Windows Form Designer'Det kan ændres ved hjælp af Windows Form Designer.'Ondret ikke det ved hjælp af kodeditoren. _Private Sub InitializeComponent () Me. CheckBox1 = Nyt system. Windows. Formularer. CheckBox () Mig. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = Sandt mig. CheckBox1.Location = Nyt system. Tegning. Punkt (29, 28) Mig. CheckBox1.Name = "CheckBox1".. . og så videre ...

Dette er den kode, du skal tilføje til dit program for at oprette en brugerdefineret kontrol. Husk, at alle metoder og egenskaber ved den faktiske CheckBox-kontrol er i en klasse leveret af .NET Framework: System. Windows. Formularer. CheckBox. Dette er ikke en del af dit projekt, fordi det er installeret i Windows til alle .NET-programmer. Men der er en masse af det.

Et andet punkt at være opmærksom på er, at hvis du bruger WPF (Windows Presentation Foundation), klassen .NET CheckBox kommer fra et helt andet bibliotek med navnet System. Windows. Controls. Denne artikel fungerer kun til et Windows Forms-program, men de arveadgangsgivere her fungerer til ethvert VB.NET-projekt.

Antag, at dit projekt har brug for en kontrol, der ligner meget en af ​​standardkontrollerne. For eksempel et afkrydsningsfelt, der ændrede farve eller viste et lille "lykkeligt ansigt" i stedet for at vise den lille "check" -grafik. Vi vil opbygge en klasse, der gør dette og vise dig, hvordan du tilføjer den til dit projekt. Selvom dette kan være nyttigt af sig selv, er det virkelige mål at demonstrere VB.NET's arv.

Lad os starte kodning

For at komme i gang skal du ændre navnet på den CheckBox, du lige har føjet til oldCheckBox. (Du ønsker måske at stoppe med at vise "Vis alle filer" igen for at forenkle Solution Explorer.) Føj nu en ny klasse til dit projekt. Der er flere måder at gøre dette på, herunder højreklikke på projektet i Solution Explorer og vælge "Tilføj" og derefter "Klasse" eller vælge "Tilføj klasse" under under menupunktet Projekt. Skift filnavnet på den nye klasse til newCheckBox at holde tingene lige. Til sidst skal du åbne kodevinduet for klassen og tilføje denne kode:

Offentlig klasse newCheckBox arv CheckBox Private CenterSquareColor As Color = Color. Rød beskyttede tilsidesættelser Sub OnPaint (ByVal pEvent _ Som PaintEventArgs) Dim CenterSquare _ Som nyt rektangel (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Kontrolleret derefter pEvent. Grafik. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class

(I denne artikel og i andre på webstedet bruges der mange linjefortsætninger til at holde linierne korte, så de passer ind i den plads, der er tilgængelig på websiden.)

Den første ting, du bemærker om din nye klassekode, er arver nøgleord. Det betyder, at alle egenskaber og metoder i en VB.NET Framework CheckBox automatisk er en del af denne. For at forstå, hvor meget arbejde dette sparer, skal du prøve at programmere noget som en CheckBox-komponent fra bunden.

Der er to vigtige ting at bemærke i koden ovenfor:

Den første er koden bruger Tilsidesæt til at erstatte standard .NET-opførsel, der ville finde sted for en OnPaint begivenhed. En OnPaint-begivenhed udløses, hver gang Windows bemærker, at en del af din skærm skal rekonstrueres. Et eksempel ville være, når et andet vindue afslører en del af din skærm. Windows opdaterer skærmen automatisk, men kalder derefter OnPaint-begivenheden i din kode. (OnPaint-begivenheden kaldes også, når formen oprindeligt oprettes.) Så hvis vi tilsidesætter OnPaint, kan vi ændre, hvordan tingene ser ud på skærmen.

Den anden er den måde Visual Basic opretter CheckBox. Hver gang forælderen "tjekkes" (det vil sige Mig. Kontrolleret er Rigtigt) derefter vil den nye kode, vi leverer i vores NewCheckBox-klasse, genfarve midten af ​​CheckBox i stedet for at tegne et afkrydsningsfelt.

Resten er det, der kaldes GDI + -kode. Denne kode vælger et rektangel, der er nøjagtigt den samme størrelse som midten af ​​et afkrydsningsfelt og farver det med GDI + -metodeopkald. De "magiske numre" til placering af det røde rektangel, "rektangel (3, 4, 10, 12)" blev bestemt eksperimentelt. Jeg har lige ændret det, indtil det så rigtigt ud.

Der er et meget vigtigt trin, som du vil sikre dig, at du ikke forlader procedurerne for tilsidesættelse:

MyBase. OnPaint (pEvent)

Overstyring betyder, at din kode vil give alle af koden til begivenheden. Men det er sjældent, hvad du ønsker. Så VB giver en måde at køre den normale .NET-kode, der ville være blevet udført til en begivenhed. Dette er udsagnet, der gør det. Den overfører den samme parameter - pEvent - til den hændelseskode, der ville være blevet udført, hvis den ikke var blevet tilsidesat, MyBase. OnPaint.

Brug af den nye kontrol

Da vores nye kontrol ikke findes i vores værktøjskasse, skal den oprettes i form med kode. Det bedste sted at gøre det er i formen belastning arrangement procedure.

Åbn kodevinduet for proceduren med indlæsning af formularhændelse, og tilføj denne kode:

Privat sub frmCustCtrlEx_Load (ByVal afsender som system. Objekt, ByVal e As-system. EventArgs) Håndterer MyBase. Indlæs dim customCheckBox som ny newCheckBox () Med customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Venstre. Top = oldCheckBox. Top + oldCheckBox. Højde. Størrelse = Ny størrelse (oldCheckBox. Størrelse. Bredde + 50, oldCheckBox. Størrelse. Højde) Slut med kontrol. Tilføj (customCheckBox) End Sub

For at placere det nye afkrydsningsfelt på formularen, har vi draget fordel af det faktum, at der allerede er en der, og bare brugt størrelsen og placeringen af ​​den ene (justeret, så tekst-egenskaben passer). Ellers bliver vi nødt til at kode positionen manuelt. Når MyCheckBox er føjet til formularen, tilføjer vi det derefter til samlingen Kontroller.

Men denne kode er ikke meget fleksibel. For eksempel er farven Rød hårdkodet, og ændring af farven kræver ændring af programmet. Du ønsker måske også en grafik i stedet for et flueben.

Her er en ny, forbedret CheckBox-klasse. Denne kode viser dig, hvordan du tager nogle af de næste trin mod VB.NET objektorienteret programmering.

Offentlig klasse bedreCheckBox arv CheckBox Private CenterSquareColor Som farve = farve. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Protected Overrides Sub OnPaint _ (ByVal pEvent As _ System). Windows. Formularer. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Kontrolleres derefter, hvis CenterSquareImage ikke er noget, så pEvent. Grafik. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Ellers pEvent. Grafik. DrawImage (CenterSquareImage, CenterSquare) Ende Hvis slut Hvis slut Sub Offentlig ejendom FillColor () Som farve Få FillColor = CenterSquareColor End Få sæt (ByVal værdi som farve) CenterSquareColor = Værdi End Set End Property Property FillImage () Som Bitmap Get FillImage = CenterSquareImage End Get Set (ByVal Value As Bitmap) CenterSquareImage = Value End Set End PropertyEnd klasse

Hvorfor BetterCheckBox-versionen er bedre

En af de vigtigste forbedringer er tilføjelsen af ​​to Ejendomme. Dette er noget, den gamle klasse overhovedet ikke gjorde.

De to nye egenskaber introduceret er

FillColor

og

FillImage

For at få en smag af, hvordan dette fungerer i VB.NET, kan du prøve dette enkle eksperiment. Føj en klasse til et standardprojekt, og indtast derefter koden:

Offentlig ejendom uanset hvad du får

Når du trykker på Enter efter at have skrevet "Hent", udfylder VB.NET Intellisense hele egenskabskodeblokken, og alt hvad du skal gøre er at kode specifikationerne for dit projekt. (Get and Set-blokke kræves ikke altid startende med VB.NET 2010, så du skal i det mindste fortælle Intellisense så meget for at starte det.)

Offentlig ejendom Uanset hvad man får slut Get Set (ByVal-værdi) End SetEnd Property

Disse blokke er udfyldt i koden ovenfor. Formålet med disse kodeblokke er at give adgang til egenskabsværdier fra andre dele af systemet.

Med tilføjelsen af ​​metoder, ville du være godt på vej til at oprette en komplet komponent. For at se et meget simpelt eksempel på en metode skal du tilføje denne kode under egenskabserklæringerne i klassen betterCheckBox:

Public Sub understrege () mig. Skrifttype = nyt system. Tegning. Skrifttype (_ "Microsoft Sans Serif", 12.0!, _ System. Tegning. Skrifttype. Fed) Mig. Størrelse = nyt system. Tegning. Størrelse (200, 35) CenterSquare. Offset (CenterSquare. Venstre - 3, CenterSquare. Top + 3) End Sub

Ud over at justere skrifttypen, der vises i en CheckBox, justerer denne metode også størrelsen på boksen og placeringen af ​​det markerede rektangel til at tage højde for den nye størrelse. Hvis du vil bruge den nye metode, skal du bare kode den på samme måde, som du vil på en hvilken som helst metode:

MyBetterEmphasizedBox. Understrege()

Og ligesom egenskaber, tilføjer Visual Studio automatisk den nye metode til Microsofts Intellisense!

Hovedmålet her er blot at demonstrere, hvordan en metode kodes. Du er måske opmærksom på, at en standard CheckBox-kontrol også tillader, at skrifttypen ændres, så denne metode tilføjer ikke rigtig meget funktion.

Den næste artikel i denne serie, Programmering af en tilpasset VB.NET-kontrol - Beyond the Basics!, viser en metode, der gør det, og forklarer også, hvordan man tilsidesætter en metode i en brugerdefineret kontrol.

instagram story viewer