Programování třídy pro vytvoření vlastního řízení VB.NET

Vytváření kompletních vlastních součástí může být velmi pokročilým projektem. Ale můžete vytvořit třídu VB.NET, která má mnoho výhod komponenty komponenty nástrojů s mnohem menší námahou. Zde je návod!

Chcete-li získat chuť, co musíte udělat, abyste vytvořili kompletní vlastní součást, zkuste tento experiment:

-> Otevřete nový projekt Windows Application ve VB.NET.
-> Přidejte do formuláře zaškrtávací políčko z panelu nástrojů.
-> Klikněte na tlačítko „Zobrazit všechny soubory“ v horní části Solution Explorer.

Tím se zobrazí soubory, které Visual Studio vytvoří pro váš projekt (takže nemusíte). Jako historická poznámka pod čarou udělal kompilátor VB6 spoustu stejných věcí, ale nikdy jste neměli přístup k kódu, protože byl pohřben v kompilovaném „p-kódu“. Ve VB6 byste také mohli vyvinout vlastní ovládací prvky, ale bylo to mnohem obtížnější a vyžadovalo speciální nástroj, který společnost Microsoft dodala právě pro tento účel.

Ve formě Designer.vb soubor zjistíte, že níže uvedený kód byl přidán automaticky na správných místech pro podporu komponenty CheckBox. (Pokud máte jinou verzi Visual Studio, může se váš kód mírně lišit.) Toto je kód, který pro vás Visual Studio zapíše.

instagram viewer

'Vyžaduje soukromé komponenty systému Windows Form Designer _ As System. ComponentModel. IContainer'NOTE: Následující postup je vyžadován 'pomocí Windows Form Designer'It může být upraven pomocí Windows Form Designer.'Ne upravovat pomocí editoru kódu. _Private Sub InitializeComponent () Me. CheckBox1 = Nový systém. Okna. Formuláře. CheckBox () Mě. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = True Me. CheckBox1.Location = Nový systém. Výkres. Bod 29, 28) Me. CheckBox1.Name = "CheckBox1".. . a tak dále ...

Toto je kód, který musíte přidat do programu a vytvořit vlastní ovládací prvek. Nezapomeňte, že všechny metody a vlastnosti skutečného ovládacího prvku CheckBox jsou ve třídě dodávané rozhraním .NET Framework: Systém. Okna. Formuláře. CheckBox. To není součástí vašeho projektu, protože je nainstalován ve Windows pro všechny .NET programy. Ale existuje hodně z toho.

Dalším bodem, který je třeba si uvědomit, je to, že používáte WPF (Windows Presentation Foundation) .NET CheckBox třída pochází z úplně jiné knihovny s názvem Systém. Okna. Řízení. Tento článek funguje pouze pro aplikaci Windows Forms, ale principy dědičnosti zde fungují pro jakýkoli projekt VB.NET.

Předpokládejme, že váš projekt potřebuje ovládací prvek, který je velmi podobný jednomu ze standardních ovládacích prvků. Například zaškrtávací políčko, které změnilo barvu, nebo zobrazovalo malou „šťastnou tvář“ namísto zobrazování malé „zaškrtávací“ grafiky. Budeme stavět třídu, která to dělá a ukážeme vám, jak ji přidat do svého projektu. I když to může být užitečné samo o sobě, skutečným cílem je demonstrovat VB.NET dědictví.

Začněme kódování

Chcete-li začít, změňte název zaškrtávacího políčka, do kterého jste právě přidali oldCheckBox. (Možná budete chtít přestat zobrazovat „Zobrazit všechny soubory“, abyste zjednodušili Průzkumníka řešení.) Nyní do projektu přidejte novou třídu. Existuje několik způsobů, jak to provést, včetně klepnutí pravým tlačítkem myši na projekt v aplikaci Solution Explorer a výběrem možnosti „Přidat“, poté „Třída“ nebo výběrem položky „Přidat třídu“ pod položkou nabídky Projekt. Změňte název souboru nové třídy na newCheckBox udržet věci v pořádku. Nakonec otevřete okno kódu pro třídu a přidejte tento kód:

Veřejná třída newCheckBox zdědí CheckBox Private CenterSquareColor As Color = Color. Červené chráněné potlačení Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Zaškrtnuto Poté pEvent. Grafika. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End End SubEnd Class

(V tomto článku a v dalších na webu se používá mnoho pokračování řádků, aby byly řádky krátké, aby se vešly do prostoru dostupného na webové stránce.)

První věc, kterou si všimnete nového kódu třídy, je Zdědí klíčové slovo. To znamená, že všechny vlastnosti a metody CheckBoxu VB.NET Framework jsou automaticky součástí této. Chcete-li ocenit, kolik práce to ušetří, musíte zkusit naprogramovat něco jako součást CheckBox od nuly.

Ve výše uvedeném kódu je třeba si všimnout dvou klíčových věcí:

První je kód používá Přepsat nahradit standardní .NET chování, které by se stalo pro OnPaint událost. Událost OnPaint se spustí vždy, když systém Windows zjistí, že část vaší obrazovky musí být rekonstruována. Příkladem by mohlo být, když jiné okno odhalí část vašeho displeje. Systém Windows automaticky aktualizuje obrazovku, ale poté v kódu vyvolá událost OnPaint. (Událost OnPaint je také volána, když je formulář původně vytvořen.) Takže pokud přepíšeme OnPaint, můžeme změnit vzhled věcí na obrazovce.

Druhým je způsob, jakým jazyka vytvoří CheckBox. Kdykoli je rodič zaškrtnut (tj. Mě. Kontrolovány je Skutečný) pak nový kód, který poskytneme ve třídě NewCheckBox, namísto nakreslení zaškrtávacího políčka přesune střed CheckBoxu.

Zbytek se nazývá GDI + kód. Tento kód vybere obdélník přesně stejné velikosti jako střed zaškrtávacího políčka a obarví jej pomocí volání metod GDI +. "Magická čísla" pro umístění červeného obdélníku "Obdélník (3, 4, 10, 12)" byla stanovena experimentálně. Jen jsem to změnil, dokud to nevypadalo dobře.

Existuje jeden velmi důležitý krok, který chcete zajistit, abyste nevynechali procedury přepsání:

MyBase. OnPaint (pEvent)

Přepsání znamená, že váš kód poskytne Všechno kódu události. Ale to je málokdy to, co chcete. VB tedy poskytuje způsob, jak spustit normální .NET kód, který by byl proveden pro událost. Toto je prohlášení, které to dělá. Předává stejný parametr - pEvent - kódu události, který by byl proveden, pokud by nebyl přepsán, MyBase. OnPaint.

Pomocí nového ovládacího prvku

Protože náš nový ovládací prvek není v našem panelu nástrojů, musí být vytvořen ve formě s kódem. Nejlepší místo k tomu je ve formě Zatížení postup události.

Otevřete okno kódu pro proceduru události načtení formuláře a přidejte tento kód:

Private Sub frmCustCtrlEx_Load (odesílatel ByVal jako systém. Objekt, ByVal e As System. EventArgs) Zpracovává MyBase. Načíst Dim customCheckBox jako nový newCheckBox () S customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. Left .Top = oldCheckBox. Top + oldCheckBox. Výška. Velikost = Nová velikost (oldCheckBox. Velikost. Width + 50, oldCheckBox. Velikost. Výška) Konec s ovládacími prvky. Přidat (customCheckBox) End Sub

Chcete-li umístit nové zaškrtávací políčko do formuláře, využili jsme skutečnost, že tam již existuje a právě jsme použili jeho velikost a polohu (upraveno tak, aby se vešla vlastnost Text). Jinak bychom museli polohu kódovat ručně. Když byl MyCheckBox přidán do formuláře, přidáme jej do kolekce Controls.

Ale tento kód není příliš flexibilní. Například barva Červená je pevně zakódována a změna barvy vyžaduje změnu programu. Můžete také chtít grafiku namísto zaškrtnutí.

Tady je nová, vylepšená třída CheckBox. Tento kód ukazuje, jak podniknout některé další kroky směrem k objektově orientovanému programování VB.NET.

Veřejná třída betterCheckBox zdědí CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare jako nový obdélník (3, 4, 10, 12) Chráněné přepíše Sub OnPaint _ (ByVal pEvent As _ System. Okna. Formuláře. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Zaškrtnuto, pokud CenterSquareImage nic není, pak pEvent. Grafika. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Else pEvent. Grafika. DrawImage (CenterSquareImage, CenterSquare) End If End If End Sub Public Public FillColor () As Color Get FillColor = CenterSquareColor End Get Set (hodnota ByVal jako barva) CenterSquareColor = Koncová hodnota nastavená jako koncová vlastnost Veřejné vlastnictví FillImage () při získávání bitmapy FillImage = CenterSquareImage Konečná získaná sada (hodnota ByVal jako bitmapa) CenterSquareImage = Koncová hodnota nastavená jako koncová vlastnostEnd Třída

Proč je verze BetterCheckBox lepší

Jedním z hlavních vylepšení je přidání dvou Vlastnosti. To je něco, co stará třída vůbec neudělala.

Dvě nové zavedené vlastnosti jsou

Vyplň barvu

a

FillImage

Chcete-li zjistit, jak to funguje ve VB.NET, zkuste tento jednoduchý experiment. Přidejte třídu do standardního projektu a zadejte kód:

Veřejné vlastnictví

Když stisknete Enter po zadání "Get", VB.NET Intellisense vyplní celý blok kódu vlastnosti a vše, co musíte udělat, je kódovat specifika pro váš projekt. (Bloky Get and Set nejsou vždy vyžadovány počínaje VB.NET 2010, takže musíte to Intellisense přinejmenším říct, abyste jej mohli spustit.)

Veřejné vlastnictví Nastavit cokoli, jak získat konec (hodnota ByVal) End SetEnd Property

Tyto bloky byly dokončeny ve výše uvedeném kódu. Účelem těchto bloků kódu je umožnit přístup k hodnotám vlastností z jiných částí systému.

S přidáním metod byste byli na dobré cestě k vytvoření kompletní komponenty. Chcete-li zobrazit velmi jednoduchý příklad metody, přidejte tento kód pod prohlášení o vlastnostech ve třídě betterCheckBox:

Public Sub Zdůraznit () Me. Písmo = Nový systém. Výkres. Písmo (_ „Microsoft Sans Serif“, 12.0!, _ Systém. Výkres. Styl fontu. Bold) Já. Velikost = Nový systém. Výkres. Velikost (200, 35) CenterSquare. Offset (CenterSquare. Vlevo - 3, CenterSquare. Top + 3) End Sub

Kromě úpravy písma zobrazeného v zaškrtávacím políčku tato metoda také upraví velikost pole a umístění zaškrtnutého obdélníku tak, aby odpovídala nové velikosti. Chcete-li použít novou metodu, stačí ji kódovat stejným způsobem jako u jakékoli jiné metody:

MyBetterEmphasizedBox. Zdůraznit()

A stejně jako vlastnosti, Visual Studio automaticky přidá novou metodu do Intellisense společnosti Microsoft!

Hlavním cílem je jednoduše ukázat, jak je metoda kódována. Možná si uvědomujete, že standardní ovládací prvek CheckBox také umožňuje změnit písmo, takže tato metoda opravdu nepřidává mnoho funkcí.

Další článek v této sérii Programování vlastního řízení VB.NET - Beyond the Basics!, ukazuje způsob, který funguje, a také vysvětluje, jak přepsat metodu v uživatelském ovládacím prvku.