Controlli creati dall'utente
.NET Framework consente di sviluppare facilmente controlli personalizzati. È possibile creare un controllo utente, ovvero un insieme di controlli standard associati gli uni agli altri tramite il codice, oppure progettare dal nulla un controllo personalizzato. È anche possibile utilizzare l'ereditarietà per creare un controllo che eredita da un controllo esistente ed estenderne le funzionalità intrinseche. Quale che sia il meccanismo adottato, .NET Framework offre le funzionalità per la creazione di un'interfaccia grafica personalizzata per qualsiasi controllo creato.
La stampa di un controllo viene realizzata tramite esecuzione del codice nel metodo OnPaint del controllo. L'unico argomento del metodo OnPaint è un oggetto PaintEventArgs che fornisce tutte le informazioni e le funzionalità richieste per il rendering del controllo. L'oggetto PaintEventArgs fornisce come proprietà due oggetti principali che vengono utilizzati nel rendering del controllo:
L'oggetto ClipRectangle, ovvero il rettangolo che rappresenta la parte del controllo che verrà disegnata. A seconda della modalità di disegno, può corrispondere all'intero controllo oppure solo a una parte.
L'oggetto Graphics, in cui sono incapsulati vari oggetti e metodi orientati alla grafica che forniscono le funzionalità necessarie per disegnare il controllo.
Per ulteriori informazioni sull'oggetto Graphics e su come utilizzarlo, vedere Procedura: creare oggetti Graphics per disegnare.
L'evento OnPaint viene generato ogni volta che si disegna il controllo o se ne aggiorna la visualizzazione. L'oggetto ClipRectangle rappresenta il rettangolo in cui disegnare. Se è necessario aggiornare l'intero controllo, l'oggetto ClipRectangle rappresenterà le dimensioni dell'intero controllo. Se invece è necessario aggiornare solo una parte del controllo, l'oggetto ClipRectangle rappresenterà solo la regione da ridisegnare. Un esempio è dato da un controllo parzialmente oscurato da un altro controllo o form nell'interfaccia utente.
Quando si eredita dalla classe Control, è necessario eseguire l'override del metodo e OnPaint fornire il codice del rendering grafico. Per fornire un'interfaccia grafica personalizzata a un controllo utente o a un controllo ereditato, è possibile eseguire l'override del metodo OnPaint. Di seguito viene illustrato un esempio.
Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
' Call the OnPaint method of the base class.
MyBase.OnPaint(pe)
' Declare and instantiate a drawing pen.
Dim myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)
' Draw an aqua rectangle in the rectangle represented by the control.
pe.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))
End Sub
protected override void OnPaint(PaintEventArgs pe)
{
// Call the OnPaint method of the base class.
base.OnPaint(pe);
// Declare and instantiate a new pen.
System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua);
// Draw an aqua rectangle in the rectangle represented by the control.
pe.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
this.Size));
}
protected void OnPaint(PaintEventArgs pe)
{
// Call the OnPaint method of the base class.
super.OnPaint(pe);
// Declare and instantiate a new pen.
System.Drawing.Pen myPen = new System.Drawing.Pen(Color.get_Aqua());
// Draw an aqua rectangle in the ClipRectangle.
pe.get_Graphics().DrawRectangle(myPen, pe.get_ClipRectangle());
}
L'esempio descritto dimostra come eseguire il rendering di un controllo con una rappresentazione grafica molto semplice: chiama il metodo OnPaint della classe base, crea un oggetto Pen con cui disegnare e, infine, disegna un ellisse nel rettangolo determinato dalle proprietà Location e Size del controllo. Benché la maggior parte del codice di rendering sia molto più complessa, in questo esempio viene illustrato l'utilizzo dell'oggetto Graphics contenuto nell'oggetto PaintEventArgs. Se si eredita da una classe che dispone già di una rappresentazione grafica, come UserControl o Button, e non si desidera incorporare tale rappresentazione nel proprio rendering, non chiamare il metodo OnPaint della classe base.
Il codice nel metodo OnPaint del controllo viene eseguito quando il controllo viene disegnato per la prima volta e a ogni successivo aggiornamento. Per garantire che il controllo venga ridisegnato a ogni ridimensionamento, aggiungere la riga seguente al costruttore del controllo:
SetStyle(ControlStyles.ResizeRedraw, True)
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.ResizeRedraw, true);
Nota
Utilizzare la proprietà Control.Region per implementare un controllo non rettangolare.
Vedere anche
Attività
Procedura: creare oggetti Graphics per disegnare