Controlli creati dall'utente

.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.

Il disegno di un controllo viene eseguito dall'esecuzione del codice nel metodo del OnPaint controllo. Il singolo argomento del OnPaint metodo è un PaintEventArgs oggetto che fornisce tutte le informazioni e le funzionalità necessarie per eseguire il rendering del controllo. fornisce PaintEventArgs come proprietà due oggetti principal che verranno usati nel rendering del controllo:

  • ClipRectangle object : rettangolo che rappresenta la parte del controllo che verrà disegnato. Può trattarsi dell'intero controllo o parte del controllo a seconda della modalità di disegno del controllo.

  • Graphics object: 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 aggiornato, ClipRectangle rappresenta le dimensioni 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 eredita dalla Control classe , è necessario eseguire l'override del OnPaint metodo e fornire codice per il rendering della grafica all'interno di . Se si desidera fornire un'interfaccia grafica personalizzata a un controllo utente o a un controllo ereditato, è anche possibile eseguire l'override del OnPaint metodo . 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 OnPaint metodo della classe di base, crea un Pen oggetto con cui disegnare e infine disegna un'ellisse nel rettangolo determinato da Location e Size del controllo . Anche se la maggior parte del codice di rendering sarà 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 Buttone non si vuole incorporare tale rappresentazione nel rendering, non è consigliabile chiamare il metodo della classe di OnPaint base.

Il codice nel OnPaint metodo del controllo verrà eseguito al primo disegno del controllo 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 Control.Region proprietà per implementare un controllo non rettangolare.

Vedi anche