In questo articolo verrà spiegato come creare controlli personalizzati Owner-Drawn per C#.
Owner-Drawn vuol dire che saranno disegnati direttamente da voi, grazie soprattutto all'utilizzo del namespace System.Drawing del .NET FrameWork.

Nel corso dell'articolo creerò, per mostrare il funzionamento, un controllo chiamato XCircle, che non sarà nient'altro che una X che diventerà un cerchio quando ci si clicca sopra e viceversa.
Ma cominciamo, intanto inseriamo alcuni using che ci serviranno successivamente:

using System.Windows.Forms;
using System.Drawing;


Poi creiamo una nuova classe che estenderà Control (presente nel namespace System.Windows.Forms):

class XCircle : Control
{
    
}


quindi overridiamo la funzione che ci interessa principalmente, in cui avverrà tutto il processo di disegno del controllo: OnPaint. A questa viene passato come paramentro un oggetto PaintEventArgs, che ci sarà utile all'interno della funzione stessa per ottenere un oggetto Graphics con il quale potremo disegnare.

protected override void OnPaint(PaintEventArgs e)
{

}


Creiamo ora, sempre nella funzione OnPaint, un nuovo oggetto Graphics a partire dalla proprietà read-only Graphics del parametro e.

Graphics g = e.Graphics;


Arrivati qui abbiamo ormai piazzato le basi del controllo e se aprissimo un file Windows Form nello stesso progetto potremo anche vedere nella Toolbox di sinistra una nuova categoria: XCirce Components (ammesso di aver chiamato la soluzione XCircle).
Ora per continuare l'esempio mostrerò il codice per completare l'XCircle Control, che spiegherò successivamente:


class XCircle : Control
{
   public bool isX = true;    //Per controllare se lo stato è impostato su X o O.
   protected override void OnPaint(PaintEventArgs e)
   {
      Graphics g = e.Graphics;
      Pen pen = new Pen(Color.Blue, 2);    //Crea un oggetto Pen di colore Blue e spessore 2 px
      if (isX)
      {
         //Disegna la X
         g.DrawLine(pen, 0, 0, Size.Width, Size.Height);
         g.DrawLine(pen, Size.Width, 0, 0, Size.Height);
      }
      else
      {
         //Disegna il O
         g.DrawEllipse(pen, 0, 0, Size.Width-2, Size.Height-2);
      }
   }
}



A questo punto si può provare il controllo portandolo in un form qualsiasi e sarà inizialmente a forma di X, basta poi modificare a Runtime il valore del campo isX a false per far comparire il cerchio.

Come ultima cosa, se in un altro progetto si ha la necessità di utilizzare il componente, basta fare click col destro sulla cartellina References nel Solution Explorer ed aggiungere il controllo che si è creato.

Per dubbi, critiche o chiarimenti potete utilizzare il forum di pierotofy.it

Giovanni Casinelli - 01/11/2007

blackshadow@pierotofy.it