Å bygge komplette tilpassede komponenter kan være et veldig avansert prosjekt. Men du kan bygge en VB.NET-klasse som har mange fordeler med en verktøykasse-komponent med mye mindre krefter. Dette er hvordan!
For å få en smak av hva du trenger å gjøre for å lage en komplett tilpasset komponent, kan du prøve dette eksperimentet:
-> Åpne et nytt Windows Application-prosjekt i VB.NET.
-> Legg til en sjekkboks fra verktøykassen til skjemaet.
-> Klikk på "Vis alle filer" -knappen øverst på Løsningsutforsker.
Dette vil vise filene som Visual Studio lager for prosjektet ditt (slik at du ikke trenger å gjøre det). Som en historisk fotnote gjorde VB6-kompilatoren mye av de samme tingene, men du fikk aldri tilgang til koden fordi den ble gravlagt i kompilert "p-kode". Du kan også utvikle tilpassede kontroller i VB6, men det var mye vanskeligere og krevde et spesialverktøy som Microsoft leverte nettopp for det formålet.
I skjemaet Designer.vb fil, vil du finne at koden nedenfor er lagt til automatisk på de rette stedene for å støtte CheckBox-komponenten. (Hvis du har en annen versjon av Visual Studio, kan koden din være litt annerledes.) Dette er koden som Visual Studio skriver for deg.
'Påkrevd av Windows Form Designer Private komponenter _ Som system. ComponentModel. IContainer'NOTE: Følgende prosedyre er obligatorisk'av Windows Form Designer'Den kan endres ved hjelp av Windows Form Designer.'Ikke endre den ved hjelp av kodeditoren._Private Sub InitializeComponent () Me. CheckBox1 = Nytt system. Windows. Former. CheckBox () Meg. SuspendLayout () '' CheckBox1 'Meg. CheckBox1.AutoSize = Sann meg. CheckBox1.Location = Nytt system. Tegning. Punkt (29, 28) Meg. CheckBox1.Name = "CheckBox1".. . og så videre ...
Dette er koden du må legge til i programmet ditt for å opprette en tilpasset kontroll. Husk at alle metodene og egenskapene til den faktiske CheckBox-kontrollen er i en klasse levert av .NET Framework: System. Windows. Former. avmerkingsbokser. Dette er ikke en del av prosjektet ditt fordi det er installert i Windows for alle .NET-programmer. Men det er en mye av det.
Et annet poeng å være klar over er at hvis du bruker WPF (Windows Presentation Foundation), klassen .NET CheckBox kommer fra et helt annet bibliotek med navnet System. Windows. kontroller. Denne artikkelen fungerer bare for en Windows Forms-applikasjon, men arveprinsippene her fungerer for alle VB.NET-prosjekter.
Anta at prosjektet ditt trenger en kontroll som er veldig lik en av standardkontrollene. For eksempel en avkrysningsrute som endret farge, eller viste et bittelitt "lykkelig ansikt" i stedet for å vise den lille "sjekk" -grafikken. Vi skal bygge en klasse som gjør dette og vise deg hvordan du kan legge den til prosjektet ditt. Selv om dette kan være nyttig av seg selv, er det virkelige målet å demonstrere VB.NETs arv.
La oss begynne å kode
For å komme i gang, endre navnet på CheckBox som du nettopp la til oldCheckBox. (Det kan være lurt å slutte å vise "Vis alle filer" igjen for å forenkle Løsningsutforsker.) Legg nå en ny klasse til prosjektet ditt. Det er flere måter å gjøre dette på, blant annet ved å høyreklikke på prosjektet i Løsningsutforsker og velge "Legg til" og deretter "Klasse" eller velge "Legg til klasse" under under prosjektmenyelementet. Endre filnavnet til den nye klassen til newCheckBox å holde ting rett. Til slutt åpner du kodevinduet for klassen og legger til denne koden:
Offentlig klasse newCheckBox arver CheckBox Private CenterSquareColor As Color = Color. Rød beskyttede overstyrer Sub OnPaint (ByVal pEvent _ Som PaintEventArgs) Dim CenterSquare _ Som nytt rektangel (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Sjekket deretter pEvent. Grafikk. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class
(I denne artikkelen og i andre på nettstedet, brukes mange linjefortsettelser for å holde linjene korte, så de vil passe inn i den tilgjengelige plassen på websiden.)
Den første tingen å legge merke til om den nye klassekoden er arver søkeord. Det betyr at alle egenskapene og metodene til en VB.NET Framework CheckBox automatisk er en del av denne. For å sette pris på hvor mye arbeid dette sparer, må du ha prøvd å programmere noe som en CheckBox-komponent fra bunnen av.
Det er to viktige ting å merke seg i koden over:
Den første er koden bruker Overstyring å erstatte standard .NET-oppførsel som vil finne sted for en OnPaint begivenhet. En OnPaint-hendelse utløses når Windows legger merke til at deler av skjermen må rekonstrueres. Et eksempel vil være når et annet vindu avdekker deler av skjermen. Windows oppdaterer skjermen automatisk, men ringer deretter OnPaint-hendelsen i koden. (OnPaint-hendelsen blir også kalt når skjemaet opprinnelig ble opprettet.) Så hvis vi overstyrer OnPaint, kan vi endre hvordan ting ser ut på skjermen.
Det andre er måten Visual Basic lager CheckBox på. Hver gang forelderen blir "sjekket" (det vil si Meg. Krysset av er ekte) så vil den nye koden vi oppgir i klassen NewCheckBox, fargelegge sentrum av sjekkboksen i stedet for å tegne et hake.
Resten er det som kalles GDI + -kode. Denne koden velger et rektangel med nøyaktig samme størrelse som midten av en avkrysningsrute og farger den inn med GDI + -metodeanrop. De "magiske tallene" for å plassere det røde rektanglet, "Rektangel (3, 4, 10, 12)", ble bestemt eksperimentelt. Jeg bare endret det til det så riktig ut.
Det er et veldig viktig trinn som du vil være sikker på at du ikke går ut av prosedyrene for å overstyre:
MyBase. OnPaint (pEvent)
Overstyring betyr at koden din vil gi alle av koden for arrangementet. Men dette er sjelden du vil. Så VB gir en måte å kjøre den normale .NET-koden som ville blitt utført for en hendelse. Dette er utsagnet som gjør det. Den overfører den samme parameteren - pEvent - til hendelseskoden som ville blitt utført hvis den ikke hadde blitt overstyrt, MyBase. OnPaint.
Bruke den nye kontrollen
Fordi den nye kontrollen vår ikke er i verktøykassen vår, må den opprettes i form med kode. Det beste stedet å gjøre det er i formen Laste hendelsesprosedyre.
Åpne kodevinduet for prosedyre for innlasting av skjema, og legg til denne koden:
Privat sub frmCustCtrlEx_Load (ByVal avsender som system. Objekt, ByVal e As System. EventArgs) Håndterer MyBase. Last inn dim customCheckBox som ny newCheckBox () Med customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Venstre. Top = oldCheckBox. Topp + oldCheckBox. Høyde. Størrelse = Ny størrelse (oldCheckBox. Størrelse. Bredde + 50, oldCheckBox. Størrelse. Høyde) Slutt med kontroller. Legg til (customCheckBox) End Sub
For å plassere den nye avkrysningsruten på skjemaet, har vi utnyttet det faktum at det allerede er en der og bare brukt størrelsen og plasseringen til den (justert slik at tekstegenskapen vil passe). Ellers må vi kode stillingen manuelt. Når MyCheckBox er lagt til skjemaet, legger vi det til i kontrollen-samlingen.
Men denne koden er ikke veldig fleksibel. For eksempel er fargen Rød hardkodet og endring av farge krever endring av programmet. Du vil kanskje også ha en grafikk i stedet for et hake.
Her er en ny, forbedret CheckBox-klasse. Denne koden viser hvordan du tar noen av de neste trinnene mot VB.NET objektorientert programmering.
Offentlig klasse bedreCheckBox arver 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. Sjekket deretter hvis CenterSquareImage er ingenting, så pEvent. Grafikk. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Ellers pEvent. Grafikk. DrawImage (CenterSquareImage, CenterSquare) End If End If End Sub Public Property FillColor () Som farge Få FillColor = CenterSquareColor End Sett (ByVal-verdi som farge) 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 Klasse
Hvorfor BetterCheckBox-versjonen er bedre
En av de viktigste forbedringene er tillegg av to Eiendommer. Dette er noe den gamle klassen ikke gjorde i det hele tatt.
De to nye egenskapene som ble introdusert er
Fyll farge
og
FillImage
For å få en smak av hvordan dette fungerer i VB.NET, kan du prøve dette enkle eksperimentet. Legg til en klasse i et standardprosjekt, og skriv deretter inn koden:
Offentlig eiendom uansett
Når du trykker på Enter etter å ha skrevet "Get", fyller VB.NET Intellisense hele eiendomskodeblokken, og alt du trenger å gjøre er å kode spesifikasjonene for prosjektet ditt. (Get and Set-blokkene er ikke alltid nødvendig med VB.NET 2010, så du må i det minste fortelle Intellisense så mye for å starte det.)
Offentlig eiendom Uansett Get End Get Set (ByVal-verdi) End SetEnd Property
Disse blokkene er fullført i koden over. Formålet med disse kodeblokkene er å gi tilgang til eiendomsverdier fra andre deler av systemet.
Med tillegg av Metoder, ville du være på god vei til å lage en komplett komponent. Hvis du vil se et veldig enkelt eksempel på en metode, legger du til denne koden under eiendomsdeklarasjonene i klassen betterCheckBox:
Public Sub understreke () Me. Font = nytt system. Tegning. Font (_ "Microsoft Sans Serif", 12.0!, _ System. Tegning. Fontstil. Fet) Me. Størrelse = Nytt system. Tegning. Størrelse (200, 35) CenterSquare. Offset (CenterSquare. Venstre - 3, CenterSquare. Topp + 3) Slutt sub
I tillegg til å justere skriften som vises i en sjekkboks, justerer denne metoden også størrelsen på boksen og plasseringen av det avkryssede rektangelet for å ta hensyn til den nye størrelsen. Hvis du vil bruke den nye metoden, er det bare å kode den på samme måte som du vil:
MyBetterEmphasizedBox. Understreke()
Og akkurat som Properties, legger Visual Studio automatisk til den nye metoden i Microsofts Intellisense!
Hovedmålet her er å ganske enkelt demonstrere hvordan en metode er kodet. Du er kanskje klar over at en standard CheckBox-kontroll også gjør at font kan endres, slik at denne metoden ikke virkelig legger til mye funksjon.
Den neste artikkelen i denne serien, Programming a Custom VB.NET Control - Beyond the Basics!, viser en metode som gjør det, og forklarer også hvordan du kan overstyre en metode i en tilpasset kontroll.