Come ho già avuto modo di dire precedentemente, ci sono
diversi argomenti che ho tralasciato nella mia serie di articoli dedicati a
MCAD. Uno di questi, la creazione di Windows Control, lo considero piuttosto
importante (e, come al solito, piuttosto divertente), per cui ne parleremo oggi
in modo magari un po' superficiale, ma più che sufficiente per superare l'esame
70-316.
Introduzione
Innanzitutto, cominciamo col dire che creare
un controllo significa in altre parole implementare una classe che erediti da
System.Windows.Forms.UserControl. Se utilizziamo l'editor
Visual Studio .NET, possiamo cominciare un progetto Windows Control
Library. L'editor ci propone in progettazione il classico Form
Designer, ma con qualche differenza. In questo contesto non stiamo disegnando
una WF, ma un Control, quindi non abbiamo ad esempio la barra del titolo ed
altre caratteristiche proprie di una WF. Possiamo posizionare controlli,
possiamo ancorarli, possiamo scrivere codice proprio come se stessimo
implementando una form, quindi tenendo conto tutto quello che ci siamo detti
negli articoli passati.
La grande differenza è che il controllo non vive di
natura propria, ma deve venir ospitato in qualche container: nel
più semplice dei casi, una Windows Form. Una volta compilato il progetto e
generato l'assembly, possiamo aggiungerne l'icona nella ToolBox dell'IDE di
VS.NET. Come? Abbiamo due possibilità:
- Clicchiamo con il pulsante destro, poi su "Add/Remove Items...",
clicchiamo sul pulsante Browse e andiamo a selezionare
l'assembly nella directory bin\Debug o
bin\Release
- Stessa procedura, ma cominciando dal menù Tools
dell'IDE
Quando l'icona è stata aggiunta nella ToolBox, il nostro controllo è a
nostra completa disposizione. Io personalmente ho preferito aggiungere un nuovo
progetto Windows Application alla soluzione corrente. In questo modo passo
velocemente dal progetto Control al progetto che ospita il Control stesso. Più
comodo di così!
Property personalizzate del nostro Control
Come tutte le
classi, anche i Control possiedono properties che possono influenzarne il
comportamento. Alcune di queste properties vengono ereditate dalla classe
UserControl, altre ovviamente possiamo definirle
noi a nostro piacimento in base alle necessità. Chi sviluppa con .NET da un
po' di tempo, può sembrare normale, ma chi proviene da VB6, per esempio, troverà anche una
piccola sorpresa. Mi spiego meglio.
Le property personalizzate appaiono automaticamente nella Property Window nel
progetto in cui viene ospitato il Control stesso. Non solo: l'IDE è anche
abbastanza intelligente: se la nostra property è definibile attraverso un public
enum, allora nella Property Window comparirà la ComboBox che ci permette di dare
un valore alla property semplicemente scegliendola tra i possibili valori. Ad
esempio, se il mio Control possiede una property di tipo
DrawingModeStyle che è un enum:
public enum DrawingModeStyle
{
Happy = 0,
Sad = 1,
Angry = 2
}
Quando andrò a selezionare il Control sulla mia WF, la Property Windows
mostrerà una cosa del genere:
Chi ha partecipato al Workshop di Luglio, sa benissimo come adattare la
Property Windows ai nostri scopi. Usando gli attributi [Category],
[Description], [Browseable] e tanti altri, possiamo regolare la nostra
property DrawingMode come vogliamo.
Disegnare un nostro Control da zero
Questo è il caso più
semplice, ovvero la costruzione di un Control "complesso" che comprende più
Control e ne estende le funzionalità. .NET ci dà la possibilità di disegnare un
controllo completamente da zero, usando tutte le classi incluse nel namespace
System.Drawing. Il succo del discorso è quello di fare
l'override dell'evento Paint del controllo di base, e disegnare
quello che vogliamo.
Farò in tempo a parlarne meglio in un altro post?