La creazione di componenti personalizzati completi può essere un progetto molto avanzato. Ma puoi creare una classe VB.NET che presenta molti dei vantaggi di un componente toolbox con molto meno sforzo. Ecco come!
Per avere un'idea di ciò che devi fare per creare un componente personalizzato completo, prova questo esperimento:
-> Apri un nuovo progetto Applicazione Windows in VB.NET.
-> Aggiungi un CheckBox dalla casella degli strumenti al modulo.
-> Fai clic sul pulsante "Mostra tutti i file" nella parte superiore di Esploratore di soluzioni.
Verranno visualizzati i file creati da Visual Studio per il tuo progetto (quindi non è necessario). Come nota a piè di pagina storica, il compilatore VB6 ha fatto molte delle stesse cose, ma non è mai stato possibile accedere al codice perché è stato sepolto nel "codice p" compilato. Potresti sviluppare controlli personalizzati anche in VB6, ma è stato molto più difficile e ha richiesto un'utilità speciale che Microsoft ha fornito proprio a tale scopo.
Nella forma Designer.vb file, troverai che il codice seguente è stato aggiunto automaticamente nelle posizioni giuste per supportare il componente CheckBox. (Se hai una versione diversa di Visual Studio, il tuo codice potrebbe essere leggermente diverso.) Questo è il codice che Visual Studio scrive per te.
'Richiesto da Windows Form Designer Componenti privati _ Come sistema. ComponentModel. IContainer'NOTA: la seguente procedura è richiesta dal Designer di Windows Form. Può essere modificata utilizzando il Designer di Windows Form. 'Non modificarlo utilizzando l'editor di codice._Private Sub InitializeComponent () Me. CheckBox1 = Nuovo sistema. Finestre. Le forme. CheckBox () Me. SuspendLayout () '' CheckBox1 'Me. CheckBox1.AutoSize = True Me. CheckBox1.Location = Nuovo sistema. Disegno. Punto (29, 28) Me. CheckBox1.Name = "CheckBox1".. . e così via ...
Questo è il codice che devi aggiungere al tuo programma per creare un controllo personalizzato. Tenere presente che tutti i metodi e le proprietà del controllo CheckBox effettivo sono in una classe fornita da .NET Framework: Sistema. Finestre. Le forme. CheckBox. Questo non fa parte del tuo progetto perché è installato in Windows per tutti i programmi .NET. Ma c'è un lotto di esso.
Un altro punto da tenere presente è che se lo stai utilizzando WPF (Windows Presentation Foundation), la classe .NET CheckBox proviene da una libreria completamente diversa denominata Sistema. Finestre. controlli. Questo articolo funziona solo per un'applicazione Windows Form, ma i principi di ereditarietà qui funzionano per qualsiasi progetto VB.NET.
Supponiamo che il tuo progetto abbia bisogno di un controllo molto simile a uno dei controlli standard. Ad esempio, una casella di controllo che ha cambiato colore o visualizzato una piccola "faccia felice" invece di visualizzare la piccola grafica "check". Costruiremo una classe che lo farà e ti mostrerà come aggiungerlo al tuo progetto. Mentre questo potrebbe essere utile da solo, il vero obiettivo è dimostrare VB.NET eredità.
Cominciamo a programmare
Per iniziare, cambia il nome del CheckBox che hai appena aggiunto oldCheckBox. (Potresti voler smettere di visualizzare nuovamente "Mostra tutti i file" per semplificare Esplora soluzioni.) Ora aggiungi una nuova classe al tuo progetto. Esistono diversi modi per farlo, incluso il clic con il tasto destro del mouse su Esplora soluzioni e selezionando "Aggiungi", quindi "Classe" o selezionando "Aggiungi classe" nella voce di menu Progetto. Cambia il nome del file della nuova classe in newCheckBox per mantenere le cose dritte. Infine, apri la finestra del codice per la classe e aggiungi questo codice:
Classe pubblica newCheckBox Eredita CheckBox Private CenterSquareColor As Color = Color. Red Protected Ignora Sub OnPaint (ByVal pEvent _ As PaintEventArgs) Dim CenterSquare _ As New Rectangle (3, 4, 10, 12) MyBase. OnPaint (pEvent) If Me. Controllato quindi pEvent. Grafica. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) End If End SubEnd Class
(In questo articolo e in altri sul sito, vengono utilizzate molte continuazioni di riga per mantenere le linee corte in modo che si adattino allo spazio disponibile sulla pagina Web.)
La prima cosa da notare sul tuo nuovo codice di classe è il eredita parola chiave. Ciò significa che tutte le proprietà e i metodi di un CheckBox Framework VB.NET fanno automaticamente parte di questo. Per apprezzare quanto lavoro risparmi, devi aver provato a programmare qualcosa come un componente CheckBox da zero.
Ci sono due cose chiave da notare nel codice sopra:
Il primo è il codice utilizzato Oltrepassare per sostituire il comportamento .NET standard che si sarebbe verificato per un OnPaint evento. Un evento OnPaint viene attivato ogni volta che Windows nota che è necessario ricostruire una parte del display. Un esempio potrebbe essere quando un'altra finestra scopre parte del display. Windows aggiorna automaticamente lo schermo, ma chiama l'evento OnPaint nel codice. (L'evento OnPaint viene chiamato anche quando il modulo viene inizialmente creato.) Quindi se eseguiamo l'override di OnPaint, possiamo cambiare l'aspetto delle cose sullo schermo.
Il secondo è il modo in cui Visual Basic crea CheckBox. Ogni volta che il genitore è "Controllato" (ovvero Me. verificato è Vero) quindi il nuovo codice che forniamo nella nostra classe NewCheckBox ricolorerà il centro del CheckBox invece di tracciare un segno di spunta.
Il resto è ciò che viene chiamato Codice GDI +. Questo codice seleziona un rettangolo della stessa identica dimensione del centro di una casella di controllo e lo colora con le chiamate al metodo GDI +. I "numeri magici" per posizionare il rettangolo rosso, "Rettangolo (3, 4, 10, 12)", sono stati determinati sperimentalmente. L'ho appena cambiato fino a quando sembrava giusto.
Esiste un passaggio molto importante che si desidera assicurarsi di non tralasciare le procedure di sostituzione:
MyBase. OnPaint (pEvent)
Override significa che il codice fornirà tutti del codice per l'evento. Ma raramente è quello che vuoi. Quindi VB fornisce un modo per eseguire il normale codice .NET che sarebbe stato eseguito per un evento. Questa è la dichiarazione che lo fa. Passa lo stesso parametro — pEvent — al codice evento che sarebbe stato eseguito se non fosse stato sovrascritto, MyBase. OnPaint.
Utilizzando il nuovo controllo
Poiché il nostro nuovo controllo non è nella nostra casella degli strumenti, deve essere creato nel modulo con il codice. Il posto migliore per farlo è nel modulo Caricare procedura dell'evento.
Aprire la finestra del codice per la procedura dell'evento di caricamento del modulo e aggiungere questo codice:
Sottotitoli privati frmCustCtrlEx_Load (mittente ByVal come sistema. Oggetto, ByVal e As System. EventArgs) Gestisce MyBase. Carica Dim customCheckBox come nuovo newCheckBox () Con customCheckBox .Text = "Custom CheckBox" .Left = oldCheckBox. A sinistra .Top = oldCheckBox. Top + oldCheckBox. Height .Size = New Size (oldCheckBox. Taglia. Larghezza + 50, oldCheckBox. Taglia. Altezza) Termina con i controlli. Aggiungi (customCheckBox) End Sub
Per posizionare la nuova casella di controllo nel modulo, abbiamo sfruttato il fatto che ce n'è già uno lì e abbiamo appena usato le dimensioni e la posizione di quello (adattato in modo che la proprietà Text si adatterà). Altrimenti dovremmo codificare la posizione manualmente. Quando MyCheckBox è stato aggiunto al modulo, lo aggiungiamo alla raccolta Controls.
Ma questo codice non è molto flessibile. Ad esempio, il colore Rosso è codificato e la modifica del colore richiede la modifica del programma. Potresti anche voler un elemento grafico anziché un segno di spunta.
Ecco una nuova classe CheckBox migliorata. Questo codice mostra come eseguire alcuni dei passi successivi verso la programmazione orientata agli oggetti VB.NET.
Classe pubblica betterCheckBox Eredita CheckBox Private CenterSquareColor As Color = Color. Blue Private CenterSquareImage As Bitmap Private CenterSquare As New Rectangle (3, 4, 10, 12) Protetto Sostituisce Sub OnPaint _ (ByVal pEvent As _ System. Finestre. Le forme. PaintEventArgs) MyBase. OnPaint (pEvent) If Me. Controllato quindi se CenterSquareImage non è niente, quindi pEvent. Grafica. FillRectangle (New SolidBrush (CenterSquareColor), CenterSquare) Else pEvent. Grafica. DrawImage (CenterSquareImage, CenterSquare) End If End If Proprietà pubblica Sub FillColor () come colore Get FillColor = CenterSquareColor End Get Set (ByVal Value As Color) CenterSquareColor = Proprietà End End End Proprietà pubblica FillImage () Come Bitmap Get FillImage = CenterSquareImage End Get Set (Valore ByVal come Bitmap) CenterSquareImage = Valore End Set End PropertyEnd Classe
Perché la versione di BetterCheckBox è migliore
Uno dei principali miglioramenti è l'aggiunta di due Proprietà. Questo è qualcosa che la vecchia classe non ha fatto affatto.
Le due nuove proprietà introdotte sono
Colore di riempimento
e
FillImage
Per avere un'idea di come funziona in VB.NET, prova questo semplice esperimento. Aggiungi una classe a un progetto standard e quindi inserisci il codice:
Proprietà pubblica qualunque sia
Quando premi Invio dopo aver digitato "Ottieni", VB.NET Intellisense riempie l'intero blocco di codice Proprietà e tutto ciò che devi fare è codificare le specifiche per il tuo progetto. (I blocchi Get e Set non sono sempre richiesti a partire da VB.NET 2010, quindi devi almeno dirlo a Intellisense per avviarlo.)
Proprietà pubblica qualunque sia Get End Get Set (valore ByVal) End SetEnd Property
Questi blocchi sono stati completati nel codice sopra. Lo scopo di questi blocchi di codice è consentire l'accesso ai valori delle proprietà da altre parti del sistema.
Con l'aggiunta di Metodi, saresti sulla buona strada per creare un componente completo. Per vedere un esempio molto semplice di un metodo, aggiungi questo codice sotto le dichiarazioni Proprietà nella classe betterCheckBox:
Sottolineatura pubblica () Me. Carattere = Nuovo sistema. Disegno. Carattere (_ "Microsoft Sans Serif", 12.0!, _ Sistema. Disegno. Stile del font. Grassetto) Io. Dimensione = Nuovo sistema. Disegno. Dimensioni (200, 35) CenterSquare. Offset (CenterSquare. Sinistra - 3, CenterSquare. Top + 3) Fine sottotitoli
Oltre a regolare il carattere visualizzato in una casella di controllo, questo metodo regola anche la dimensione della casella e la posizione del rettangolo selezionato per tenere conto della nuova dimensione. Per utilizzare il nuovo metodo, basta codificarlo nello stesso modo in cui si farebbe con qualsiasi metodo:
MyBetterEmphasizedBox. Enfatizzare()
E proprio come Proprietà, Visual Studio aggiunge automaticamente il nuovo metodo a Intellisense di Microsoft!
L'obiettivo principale qui è semplicemente dimostrare come un metodo è codificato. Potresti essere consapevole del fatto che un controllo CheckBox standard consente anche di modificare il carattere, quindi questo metodo non aggiunge molta funzione.
Il prossimo articolo di questa serie, Programmazione di un controllo VB.NET personalizzato - Beyond the Basics!, mostra un metodo che funziona e spiega anche come sovrascrivere un metodo in un controllo personalizzato.