Condividi tramite


User-Drawn controlli

.NET Framework offre la possibilità di sviluppare facilmente controlli personalizzati. È possibile creare un controllo utente, ovvero un set di controlli standard associati con codice, oppure progettare il proprio controllo da zero. È anche possibile usare l'ereditarietà per creare un controllo che eredita da un controllo esistente e aggiungerne la funzionalità intrinseca. Indipendentemente dall'approccio usato, .NET Framework offre la funzionalità per disegnare un'interfaccia grafica personalizzata per qualsiasi controllo creato.

La pitturazione di un controllo viene effettuata tramite l'esecuzione del codice nel metodo OnPaint del controllo. Il singolo argomento del metodo OnPaint è un oggetto PaintEventArgs che fornisce tutte le informazioni e le funzionalità necessarie per eseguire il rendering del controllo. Il PaintEventArgs fornisce come proprie due oggetti principali che verranno usati nel rendering del tuo controllo.

  • ClipRectangle oggetto - il rettangolo che rappresenta la parte del controllo che verrà tracciata. Può trattarsi dell'intero controllo o parte del controllo a seconda della modalità di disegno del controllo.

  • Graphics oggetto : incapsula diversi oggetti e metodi orientati alla grafica che forniscono la funzionalità necessaria per disegnare il controllo.

Per altre informazioni sull'oggetto Graphics e su come usarlo, vedere Procedura: Creare oggetti grafici per il disegno.

L'evento OnPaint viene generato ogni volta che il controllo viene disegnato o aggiornato sullo schermo e l'oggetto ClipRectangle rappresenta il rettangolo in cui verrà eseguito il disegno. Se l'intero controllo deve essere rinfrescato, il ClipRectangle rappresenterà la dimensione dell'intero controllo. Se tuttavia è necessario aggiornare solo parte del controllo, l'oggetto ClipRectangle rappresenterà solo l'area che deve essere ridisegnata. Un esempio di questo caso è quando un controllo è stato parzialmente nascosto da un altro controllo o modulo nell'interfaccia utente.

Quando si eredita dalla classe Control, è necessario eseguire l'override del metodo OnPaint e fornire codice per il rendering grafico all'interno. Se si desidera fornire un'interfaccia grafica personalizzata a un controllo utente o a un controllo ereditato, è anche possibile eseguire l'override del metodo OnPaint. Di seguito è riportato un esempio:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)  
   ' Call the OnPaint method of the base class.  
   MyBase.OnPaint(e)  
  
   ' Declare and instantiate a drawing pen.  
   Using myPen As System.Drawing.Pen = New System.Drawing.Pen(Color.Aqua)  
      ' Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, New Rectangle(Me.Location, Me.Size))  
   End Using
End Sub  
protected override void OnPaint(PaintEventArgs e)  
{  
   // Call the OnPaint method of the base class.  
   base.OnPaint(e);  
  
   // Declare and instantiate a new pen.  
   using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua))  
   {
      // Draw an aqua rectangle in the rectangle represented by the control.  
      e.Graphics.DrawRectangle(myPen, new Rectangle(this.Location,
         this.Size));  
   }
}  

Nell'esempio precedente viene illustrato come eseguire il rendering di un controllo con una rappresentazione grafica molto semplice. Chiama il metodo OnPaint della classe di base, crea un oggetto Pen con cui disegnare e infine disegna un'ellisse nel rettangolo determinato dal Location e Size del controllo. Sebbene la maggior parte del codice di rendering sia notevolmente più complessa di questa, in questo esempio viene illustrato l'uso dell'oggetto Graphics contenuto nell'oggetto PaintEventArgs. Si noti che se si eredita da una classe che dispone già di una rappresentazione grafica, ad esempio UserControl o Button, e non si vuole incorporare tale rappresentazione nel rendering, non è consigliabile chiamare il metodo di OnPaint della classe di base.

Il codice nel metodo OnPaint del controllo verrà eseguito quando il controllo viene disegnato per la prima volta e ogni volta che viene aggiornato. Per assicurarsi che il controllo venga ridisegnato ogni volta che viene ridimensionato, aggiungere la riga seguente al costruttore del controllo:

SetStyle(ControlStyles.ResizeRedraw, True)  
SetStyle(ControlStyles.ResizeRedraw, true);  

Nota

Utilizzare la proprietà Control.Region per implementare un controllo non rettangolare.

Vedere anche