Construirea de componente personalizate complete poate fi un proiect foarte avansat. Dar puteți construi o clasă VB.NET care are multe dintre avantajele unei componente a cutiei de instrumente cu mult mai puțin efort. Iată cum!
Pentru a obține o aromă a ceea ce trebuie să faceți pentru a crea o componentă personalizată completă, încercați acest experiment:
-> Deschideți un nou proiect de aplicație Windows în VB.NET.
-> Adăugați un CheckBox din caseta de instrumente la formular.
-> Faceți clic pe butonul „Afișați toate fișierele” din partea de sus a Explorator de soluții.
Aceasta va afișa fișierele pe care Visual Studio le creează pentru proiectul dvs. (deci nu trebuie). Ca o notă de subsol istorică, compilatorul VB6 a făcut multe lucruri identice, dar niciodată nu ați putut accesa codul, deoarece a fost îngropat în „p-cod” compilat. Puteți dezvolta și controale personalizate în VB6, dar a fost mult mai dificil și a necesitat o utilitate specială pe care Microsoft a furnizat-o doar în acest scop.
În formular Designer.vb fișier, veți găsi că codul de mai jos a fost adăugat automat în locațiile potrivite pentru a sprijini componenta CheckBox. (Dacă aveți o versiune diferită de Visual Studio, codul dvs. poate fi ușor diferit.) Acesta este codul pe care Visual Studio scrie pentru dvs.
'Necesitat de componentele particulare Windows Form Designer _ ca sistem. ComponentModel. ICONtainer'NOTE: Următoarea procedură este necesară prin proiectantul Windows Form'Pot fi modificat folosind Windows Form Designer. Nu-l modificați folosind editorul de coduri._Private Sub InitializeComponent () Eu. CheckBox1 = Sistem nou. Windows. Formulare. CheckBox () Eu. SuspendLayout () '' CheckBox1 ''. CheckBox1.AutoSize = True Me. CheckBox1.Location = Sistem nou. Desen. Punctul (29, 28) Eu. CheckBox1.Name = "CheckBox1".. . si asa mai departe ...
Acesta este codul pe care trebuie să îl adăugați la program pentru a crea un control personalizat. Rețineți că toate metodele și proprietățile controlului CheckBox sunt într-o clasă furnizată de .NET Framework: Sistem. Windows. Formulare. Caseta de bifat. Acesta nu face parte din proiectul dvs., deoarece este instalat în Windows pentru toate programele .NET. Dar există un mult din ea.
Un alt punct de care trebuie să știți este că dacă utilizați WPF (Windows Presentation Foundation), clasa .NET CheckBox provine dintr-o bibliotecă complet diferită numită Sistem. Windows. Controale. Acest articol funcționează doar pentru o aplicație Windows Forms, dar principalii de moștenire lucrează aici pentru orice proiect VB.NET.
Să presupunem că proiectul dvs. are nevoie de un control care seamănă foarte mult cu unul dintre controalele standard. De exemplu, o casetă de selectare care și-a schimbat culoarea sau a afișat o minusculă „față fericită” în loc să afișeze mica grafică „verificare”. Vom construi o clasă care face acest lucru și vă va arăta cum să o adăugați la proiectul dvs. În timp ce acest lucru poate fi util de la sine, scopul real este să demonstreze VB.NET moştenire.
Să începem codificarea
Pentru a începe, schimbați numele CheckBox pe care tocmai l-ați adăugat oldCheckBox. (Poate doriți să opriți din nou afișarea „Afișați toate fișierele” pentru a simplifica Exploratorul de soluții.) Acum adăugați o nouă clasă la proiectul dvs. Există mai multe modalități de a face acest lucru, inclusiv să faceți clic dreapta pe proiect în Exploratorul de soluții și să selectați „Adăugați”, apoi „Clasă” sau selectați „Adăugați clasă” sub elementul de meniu Proiect. Schimbați numele fișierului din noua clasă la newCheckBox să ții lucrurile drepte. În cele din urmă, deschideți fereastra de cod pentru clasă și adăugați acest cod:
Clasa publică newCheckBox Moștenire CheckBox Private CenterSquareColor As Color = Color. Red Protected Overrides Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Verificat Apoi pEvent. Grafică. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class
(În acest articol și în altele de pe site, o mulțime de continuări de linie sunt utilizate pentru a menține liniile scurte, astfel încât acestea să se încadreze în spațiul disponibil pe pagina web.)
Primul lucru de remarcat despre noul dvs. cod de clasă este Moștenește cuvinte cheie. Aceasta înseamnă că toate proprietățile și metodele unui VB.NET Framework CheckBox fac parte automat din aceasta. Pentru a aprecia cât de multă muncă economisește acest lucru, trebuie să fi încercat să programați ceva ca o componentă CheckBox de la zero.
Există două aspecte cheie în codul de mai sus:
Primul este utilizarea codurilor Trece peste pentru a înlocui comportamentul .NET standard care ar avea loc pentru un OnPaint eveniment. Un eveniment OnPaint este declanșat de fiecare dată când Windows observă că o parte a afișajului dvs. trebuie reconstruită. Un exemplu ar fi atunci când o altă fereastră descoperă o parte a afișajului tău. Windows actualizează automat ecranul, dar apoi apelează la evenimentul OnPaint din codul dvs. (Evenimentul OnPaint se numește și atunci când formularul este inițial creat.) Deci, dacă anulăm OnPaint, putem schimba felul în care arată lucrurile pe ecran.
Al doilea este modul în care Visual Basic creează CheckBox. Ori de câte ori părintele este „verificat” (adică Pe mine. verificat este Adevărat) apoi noul cod pe care îl furnizăm în clasa noastră NewCheckBox va memora centrul CheckBox în loc să deseneze o bifă.
Restul este ceea ce se numește Cod GDI +. Acest cod selectează un dreptunghi la aceeași dimensiune exact ca centrul unei casete de selectare și îl colorează cu apelurile la metoda GDI +. „Numerele magice” pentru poziționarea dreptunghiului roșu, „Rectangle (3, 4, 10, 12)”, au fost determinate experimental. Am schimbat-o până când a părut corect.
Există un pas foarte important pe care doriți să îl asigurați că nu lăsați în afara procedurilor de anulare:
MyBase. OnPaint (pEvent)
Înlocuirea înseamnă că codul dvs. vă va furniza toate a codului pentru eveniment. Dar asta este rareori ceea ce îți dorești. Deci VB oferă o modalitate de a rula codul .NET normal care ar fi fost executat pentru un eveniment. Aceasta este afirmația care face asta. Trece același parametru - pEvent - la codul de eveniment care ar fi fost executat dacă nu ar fi fost ignorat, MyBase. OnPaint.
Utilizarea noului control
Deoarece noul nostru control nu se află în cutia noastră de instrumente, trebuie creat în formular cu cod. Cel mai bun loc pentru a face acest lucru este în formă Sarcină procedura evenimentului.
Deschideți fereastra de cod pentru procedura evenimentului de încărcare a formularului și adăugați acest cod:
Sub Privat frmCustCtrlEx_Load (expeditor ByVal ca sistem. Obiect, sistem ByVal e As. EventArgs) se ocupă cu MyBase. Load Dim personalCheckBox Ca nou newCheckBox () Cu customCheckBox .Text = "CheckBox personalizat" .Left = oldCheckBox. Stânga. Top = oldCheckBox. Top + oldCheckBox. Înălțime. Dimensiune = Dimensiune nouă (vechiCheckBox. Mărimea. Latime + 50, oldCheckBox. Mărimea. Înălțime) Se încheie cu controale. Adăugați (customCheckBox) End Sub
Pentru a plasa noua casetă de selectare a formularului, am profitat de faptul că există deja una acolo și am folosit doar dimensiunea și poziția aceleia (ajustată astfel încât proprietatea Text să se potrivească). În caz contrar, ar trebui să codăm poziția manual. Când MyCheckBox a fost adăugat la formular, îl adăugăm în colecția Controls.
Dar acest cod nu este foarte flexibil. De exemplu, culoarea Roșu este codată și schimbarea culorii necesită schimbarea programului. S-ar putea să doriți și un grafic în loc de o marcă de validare.
Iată o nouă clasă CheckBox îmbunătățită. Acest cod vă arată cum puteți face unele dintre următorii pași către programarea VB.NET orientată pe obiect.
Public Class betterCheckBox Moșteni CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Anulează protejate Sub OnPaint _ (ByVal pEvent As _ System. Windows. Formulare. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Verificat Apoi, dacă CenterSquareImage nu este nimic, atunci pEvent. Grafică. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) În rest pEvent. Grafică. DrawImage (CenterSquareImage, CenterSquare) End If End If End If End Sub Sub Proprietate publică FillColor () As Color Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Valoare Proprietate finală Proprietate finală Proprietate publică FillImage () Pe măsură ce Bitmap Obțineți FillImage = Setul final CenterSquareImage Obține setul (Valoarea ByVal ca bitmap) CenterSquareImage = Valoarea finală Set Set End PropertyEnd Clasă
De ce versiunea BetterCheckBox este mai bună
Una dintre principalele îmbunătățiri este adăugarea a două Proprietăți. Este ceva ce clasa veche nu a făcut deloc.
Cele două noi proprietăți introduse sunt
FillColor
și
FillImage
Pentru a obține o aromă a modului în care funcționează acest lucru în VB.NET, încercați acest experiment simplu. Adăugați o clasă la un proiect standard și apoi introduceți codul:
Proprietate publică
Când apăsați Enter după ce tastați „Get”, VB.NET Intellisense completează întregul bloc de cod de proprietate și tot ce trebuie să faceți este să codați specificațiile pentru proiectul dvs. (Blocurile Obțineți și setați nu sunt întotdeauna necesare începând cu VB.NET 2010, așa că trebuie să spuneți Intellisense acest lucru mult ca să îl porniți.)
Proprietate publică Whatever Get End End Set (valoare ByVal) Final SetEnd Property
Aceste blocuri au fost completate în codul de mai sus. Scopul acestor blocuri de cod este de a permite accesul la valorile proprietății din alte părți ale sistemului.
Odată cu adăugarea de Metode, veți fi bine în calea creării unei componente complete. Pentru a vedea un exemplu foarte simplu de metodă, adăugați acest cod sub declarațiile de proprietate din clasa betterCheckBox:
Subliniază publicul () Eu. Font = Sistem nou. Desen. Font (_ "Microsoft Sans Serif", 12.0!, _ Sistem. Desen. Stilul fontului. Bold) Eu. Dimensiune = Sistem nou. Desen. Dimensiune (200, 35) CenterSquare. Offset (CenterSquare. Stânga - 3, CenterSquare. Top + 3) End Sub
Pe lângă reglarea fontului afișat într-un CheckBox, această metodă ajustează, de asemenea, dimensiunea casetei și locația dreptunghiului bifat pentru a ține cont de noua dimensiune. Pentru a utiliza noua metodă, codificați-o la fel cum ați face orice metodă:
MyBetterEmphasizedBox. Sublinia()
Și la fel ca Proprietăți, Visual Studio adaugă automat noua metodă la Intellisense Microsoft!
Principalul obiectiv aici este de a demonstra pur și simplu modul în care o metodă este codificată. Este posibil să fiți conștienți de faptul că un control CheckBox standard permite schimbarea fontului, deci această metodă nu adaugă într-adevăr o funcție.
Următorul articol din această serie, Programarea unui control personalizat VB.NET - Dincolo de elementele de bază!, arată o metodă care face acest lucru și, de asemenea, explică modul de a trece peste o metodă într-un control personalizat.