Een klasse programmeren om een ​​aangepast VB.NET-besturingselement te maken

Het bouwen van complete componenten op maat kan een zeer geavanceerd project zijn. Maar u kunt met veel minder moeite een VB.NET-klasse bouwen die veel van de voordelen van een toolbox-component heeft. Hier is hoe!

Probeer dit experiment om een ​​idee te krijgen van wat u moet doen om een ​​volledig aangepast onderdeel te maken:

-> Open een nieuw Windows Application-project in VB.NET.
-> Voeg een CheckBox uit de Toolbox toe aan het formulier.
-> Klik op de knop "Alle bestanden weergeven" bovenaan Solution Explorer.

Hiermee worden de bestanden weergegeven die Visual Studio voor uw project maakt (zodat u dit niet hoeft te doen). Als historische voetnoot deed de VB6-compiler veel dezelfde dingen, maar je kon nooit toegang krijgen tot de code omdat deze begraven lag in de gecompileerde "p-code". U kunt ook aangepaste bedieningselementen in VB6 ontwikkelen, maar het was een stuk moeilijker en vereiste een speciaal hulpprogramma dat Microsoft speciaal voor dat doel leverde.

In het formulier Designer.vb

instagram viewer
bestand, zult u zien dat de onderstaande code automatisch op de juiste locaties is toegevoegd om het CheckBox-onderdeel te ondersteunen. (Als u een andere versie van Visual Studio hebt, kan uw code enigszins afwijken.) Dit is de code die Visual Studio voor u schrijft.

'Vereist door de Windows Form Designer Privé-componenten _ als systeem. ComponentModel. IContainer'OPMERKING: de volgende procedure is vereist 'door de Windows Form Designer'Het kan worden gewijzigd met de Windows Form Designer.'Wijzig de code niet met de code-editor. _Private Sub InitializeComponent () Me. CheckBox1 = Nieuw systeem. Ramen. Vormen. CheckBox () Me. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = True Me. CheckBox1.Location = Nieuw systeem. Tekening. Point (29, 28) Ik. CheckBox1.Name = "CheckBox1".. . enzovoorts ...

Dit is de code die u aan uw programma moet toevoegen om een ​​aangepast besturingselement te maken. Houd er rekening mee dat alle methoden en eigenschappen van het daadwerkelijke CheckBox-besturingselement zich in een klasse bevinden die wordt geleverd door .NET Framework: Systeem. Ramen. Vormen. CheckBox. Dit maakt geen deel uit van uw project omdat het in Windows is geïnstalleerd voor alle .NET-programma's. Maar er is een veel ervan.

Een ander punt om op te letten is dat als je gebruikt WPF (Windows Presentation Foundation), komt de .NET CheckBox-klasse uit een geheel andere bibliotheek met de naam Systeem. Ramen. Bedieningselementen. Dit artikel werkt alleen voor een Windows Forms-toepassing, maar de principes van overerving werken hier voor elk VB.NET-project.

Stel dat uw project een besturing nodig heeft die veel weg heeft van een van de standaardbesturingen. Bijvoorbeeld een selectievakje dat van kleur is veranderd of een klein "blij gezicht" heeft weergegeven in plaats van het kleine "vinkje" weer te geven. We gaan een klasse bouwen die dit doet en je laten zien hoe je deze aan je project kunt toevoegen. Hoewel dit op zichzelf nuttig kan zijn, is het echte doel om VB.NET's te demonstreren erfenis.

Laten we beginnen met coderen

Wijzig eerst de naam van de CheckBox waaraan u zojuist hebt toegevoegd oldCheckBox. (Misschien wilt u stoppen met het weergeven van "Alle bestanden weergeven" om Solution Explorer te vereenvoudigen.) Voeg nu een nieuwe klasse toe aan uw project. Er zijn verschillende manieren om dit te doen, waaronder met de rechtermuisknop op het project klikken in Solution Explorer en "Toevoegen" en vervolgens "Klasse" selecteren of "Klasse toevoegen" selecteren onder het menu-item Project. Wijzig de bestandsnaam van de nieuwe klasse in nieuweCheckBox om dingen recht te houden. Open ten slotte het codevenster voor de klas en voeg deze code toe:

Public Class newCheckBox Erft CheckBox Private CenterSquareColor als kleur = kleur. Rode beschermde overschrijvingen Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Aangevinkt Dan pEvent. Graphics. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class

(In dit artikel en op andere sites op de site worden veel lijnonderbrekingen gebruikt om lijnen kort te houden, zodat ze in de beschikbare ruimte op de webpagina passen.)

Het eerste dat opvalt aan uw nieuwe klassecode is de Overerving zoekwoord. Dat betekent dat alle eigenschappen en methoden van een VB.NET Framework CheckBox automatisch deel uitmaken van deze. Om te waarderen hoeveel werk dit bespaart, moet u hebben geprobeerd zoiets als een CheckBox-component helemaal opnieuw te programmeren.

Er zijn twee belangrijke dingen om op te merken in de bovenstaande code:

De eerste is de code die wordt gebruikt Negeren om het standaard .NET-gedrag te vervangen dat zou plaatsvinden voor een OnPaint evenement. Een OnPaint-gebeurtenis wordt geactiveerd wanneer Windows merkt dat een deel van uw beeldscherm moet worden gereconstrueerd. Een voorbeeld zou zijn wanneer een ander venster een deel van uw weergave onthult. Windows werkt het display automatisch bij, maar roept vervolgens de OnPaint-gebeurtenis in uw code aan. (De gebeurtenis OnPaint wordt ook genoemd wanneer het formulier voor het eerst wordt gemaakt.) Dus als we OnPaint opheffen, kunnen we de manier wijzigen waarop dingen op het scherm worden weergegeven.

De tweede is de manier waarop Visual Basic de CheckBox maakt. Wanneer de ouder "Gecontroleerd" is (dat wil zeggen, Me. Aangevinkt is Klopt) dan zal de nieuwe code die we in onze NewCheckBox-klasse bieden, het midden van de CheckBox opnieuw kleuren in plaats van een vinkje te plaatsen.

De rest is wat wordt genoemd GDI + code. Deze code selecteert een rechthoek van exact dezelfde grootte als het midden van een selectievakje en kleurt deze in met GDI + -methode-aanroepen. De "magische getallen" om de rode rechthoek te plaatsen, "Rechthoek (3, 4, 10, 12)", werden experimenteel bepaald. Ik heb het net veranderd totdat het er goed uitzag.

Er is een zeer belangrijke stap die u wilt voorkomen dat u procedures voor negeren achterwege laat:

MyBase. OnPaint (pEvent)

Overschrijven betekent dat uw code dit oplevert allemaal van de code voor het evenement. Maar dit is zelden wat je wilt. Dus VB biedt een manier om de normale .NET-code uit te voeren die zou zijn uitgevoerd voor een evenement. Dit is de verklaring die dat doet. Het geeft dezelfde parameter - pEvent - door aan de gebeurteniscode die zou zijn uitgevoerd als deze niet was overschreven, MyBase. OnPaint.

Het nieuwe besturingselement gebruiken

Omdat ons nieuwe besturingselement niet in onze toolbox staat, moet het worden gemaakt in de vorm met code. De beste plaats om dat te doen is in de vorm Laden gebeurtenis procedure.

Open het codevenster voor de procedure voor het laden van formulierformulieren en voeg deze code toe:

Private Sub frmCustCtrlEx_Load (ByVal-afzender als systeem. Object, ByVal en als systeem. EventArgs) verwerkt MyBase. Laad dim customCheckBox als nieuw newCheckBox () Met customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Links .Top = oldCheckBox. Top + oldCheckBox. Hoogte .Maat = Nieuwe grootte (oldCheckBox. Grootte. Breedte + 50, oldCheckBox. Grootte. Hoogte) Einde met bedieningselementen. Toevoegen (customCheckBox) End Sub

Om het nieuwe selectievakje op het formulier te plaatsen, hebben we gebruik gemaakt van het feit dat er al een is en hebben we de grootte en positie van die gebruikt (aangepast zodat de eigenschap Text past). Anders zouden we de positie handmatig moeten coderen. Wanneer MyCheckBox is toegevoegd aan het formulier, voegen we het toe aan de Controls-collectie.

Maar deze code is niet erg flexibel. De kleur Rood is bijvoorbeeld hard gecodeerd en voor het wijzigen van de kleur moet het programma worden gewijzigd. Misschien wilt u ook een afbeelding in plaats van een vinkje.

Hier is een nieuwe, verbeterde CheckBox-klasse. Deze code laat u zien hoe u enkele van de volgende stappen in de richting van VB.NET objectgeoriënteerd programmeren kunt nemen.

Public Class betterCheckBox neemt CheckBox Private CenterSquareColor over als kleur = kleur. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Beschermde overschrijvingen Sub OnPaint _ (ByVal pEvent As _ System. Ramen. Vormen. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Gecontroleerd als CenterSquareImage niets is dan pEvent. Graphics. FillRectangle (Nieuwe SolidBrush (CenterSquareColor), CenterSquare) Anders pEvent. Graphics. DrawImage (CenterSquareImage, CenterSquare) End If End If End Sub Public Property FillColor () As Color Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Waarde Einde Set End Eigenschap Openbare Eigenschap FillImage () Als Bitmap Get FillImage = CenterSquareImage End Get Set (ByVal Waarde As Bitmap) CenterSquareImage = Waarde End Set End Einde PropertyEnd Klasse

Waarom de BetterCheckBox-versie beter is

Een van de belangrijkste verbeteringen is de toevoeging van twee Eigendommen. Dit is iets dat de oude klasse helemaal niet deed.

De twee nieuwe eigenschappen zijn geïntroduceerd

Opvulkleur

en

FillImage

Probeer dit eenvoudige experiment om een ​​idee te krijgen hoe dit werkt in VB.NET. Voeg een klasse toe aan een standaardproject en voer vervolgens de code in:

Openbaar eigendom Wat u ook krijgt

Wanneer u op Enter drukt nadat u "Get" hebt getypt, vult VB.NET Intellisense het volledige blok met de eigenschapscode in en hoeft u alleen de specifieke gegevens voor uw project te coderen. (De blokken Get en Set zijn niet altijd vereist vanaf VB.NET 2010, dus je moet Intellisense op zijn minst zoveel vertellen om het te starten.)

Openbare eigenschap Wat er ook wordt beëindigd Eind instellen (ByVal-waarde) Eind SetEnd Eigenschap

Deze blokken zijn in de bovenstaande code ingevuld. Het doel van deze codeblokken is om toegang te krijgen tot eigenschapswaarden vanuit andere delen van het systeem.

Met de toevoeging van methoden zou u goed op weg zijn om een ​​compleet onderdeel te maken. Om een ​​heel eenvoudig voorbeeld van een methode te zien, voegt u deze code toe onder de eigenschapsverklaringen in de klasse betterCheckBox:

Public Sub Benadruk () mij. Lettertype = nieuw systeem. Tekening. Lettertype (_ "Microsoft Sans Serif", 12.0!, _ Systeem. Tekening. Lettertype. Bold) Me. Grootte = nieuw systeem. Tekening. Grootte (200, 35) CenterSquare. Offset (CenterSquare. Links - 3, CenterSquare. Top + 3) Einde Sub

Naast het aanpassen van het lettertype dat wordt weergegeven in een CheckBox, past deze methode ook de grootte van het vak en de locatie van de aangevinkte rechthoek aan om rekening te houden met de nieuwe grootte. Om de nieuwe methode te gebruiken, codeert u deze op dezelfde manier als elke andere methode:

MyBetterEmphasizedBox. Benadrukken()

En net als Eigenschappen voegt Visual Studio de nieuwe methode automatisch toe aan Microsoft Intellisense!

Het belangrijkste doel hier is om eenvoudig aan te tonen hoe een methode wordt gecodeerd. U weet misschien dat met een standaard CheckBox-besturingselement ook het lettertype kan worden gewijzigd, dus deze methode voegt niet echt veel functie toe.

Het volgende artikel in deze serie, Programming a Custom VB.NET Control - Beyond the Basics!, toont een methode die dat wel doet, en legt ook uit hoe je een methode in een aangepast besturingselement kunt overschrijven.