La grafica (Parte I)
Nell’articolo seguente verranno presentate lepotenzialità grafiche offerte dai namespaceSystem.Drawing e System.Drawing2D, System.Drawing.Imaging,System.Drawing.Text fondamentali per i programmatori DotNet;l’esempio fornito a corredo dell’articolosarà realizzato utilizzando il linguaggio C#.
Il namespace System.Drawing, con le sue classi, fornisceaccesso alle potenzialità grafiche di base GDI+, ilnamespace System.Drawing2D fornisce invecefunzionalità grafiche avanzate bidimensionale evettoriale per GDI+, ulteriori funzionalità grafichesono disponibili nei namespace System.Drawing.Imaging eSystem.Drawing.Text.
I namespaces system.drawing e system.drawing.drawing2d
Il Namespace System.Drawing, grazie al supporto di un gruppodi classi, strutture, delegati ed enumerazioni consente diaccedere alle funzioni grafiche di base GDI+.
In particolare la classe Graphics consente di incapsulareuna superficie di disegno GDI+ e fornisce un’ampiagamma di metodi e proprietà noti anche come primitivedi disegno; queste permettono di disegnare linee, punti,ellissi, archi su un controllo o modulo.
La superficie di disegno (la zona su cui si intendedisegnare) è un oggetto ed i metodi e/oproprietà utilizzati per realizzare la grafica operanoutilizzando le coordinate dell’area client del modulo.Una forma chiusa, quale un rettangolo o un'ellisse,è costituita da un contorno e da una zona interna.
Il contorno viene tracciato con una penna e l'internoviene riempito con un pennello.
Alla base della realizzazione della grafica di base vi sonole due classi Pen e Brush che realizzano proprio i concettidi penna e pennello sopra esposti.
La classe Pen definisce un oggetto necessario per poterdisegnare linee e curve; una penna rossa può essere adesempio creata secondo la sintassi seguente:
Pen redPen = new Pen(Color.Red); |
Nell’esempio viene creta una nuova penna dalla classePen, la penna permette di disegnare una linea uniforme con lostile predefinito di colore blu (la struttura Colorrappresenta un colore definito
del sistema).
E’ anche possibile specificare lo stile della linea perla penna creata:
redPen.DashStyle = DashStyle.DashDot; |
In questo caso la linea sarà costituita da una seriedi trattini e punti alternati.
Nella tabella seguente vengono mostrati gli stili disponibiliper le linee
- Custom | Ammette uno stile tratteggiato personalizzato definitodall'utente. |
- Dash | Disegna una linea composta da trattini. |
- DashDot | Disegna una linea composta da un motivo ripetutotrattino-punto. |
- DashDotDot | Disegna una linea composta da un motivo ripetutotrattino-punto-punto. |
- Dot | Disegna una linea composta da punti. |
- Solid | Disegna una linea continua. |
La classe Brush viene invece utilizzata per definire lo stiledi riempimento della parte interna delle forme chiuse;è possibile creare un pennello utilizzando la seguentesintassi:
Brush redBrush = new SolidBrush(Color.Red); |
Sono disponibili svariate classi di pennelli per ilriempimento dell'interno di forme chiuse, nella tabellaseguente vengono illustrate le diverse tipologie di pennelliutilizzabili:
- SolidBrush | Pennello a tinta unita |
- HatchBrush | Pennello tratteggiato |
- TextureBrush | Pennello a trama |
- GradientBrush | Pennello sfumato |
Una volta create le istanze della classe Pen o Brush, perliberare le risorse si può utilizzare il metodoDispose(); ad esempio nel caso del redBrush creatonell’esempio precedente basta scrivere:
redBrush.Dispose(); |
Si è detto, che data una forma chiusa, il contornoviene tracciato facendo uso di una penna e l'internoviene riempito con un pennello, ma non si è ancoramostrato come, una volta creata la penna, sia possibiletracciare effettivamente la linea oppure, dato il pennello,creato tramite la classe Brush, sia possibile riempireeffettivamente la forma chiusa.
L'oggetto Graphics fornisce una collection predefinita dimetodi che possono essere utilizzati a tale scopo;l'oggetto Pen o Brush, a seconda dei casi, viene passatocome uno degli argomenti del metodo dell’oggettoGraphics.
Di seguito vengono brevemente presentati alcuni dei metodipiù utilizzati per disegnare forme grafiche.
- DrawArc | Il metodo permette di disegnare un arcodall’ellisse specificata; èsovraccaricato:public void DrawArc (Pen, Rectangle, float, float);public void DrawArc (Pen, RectangleF, float, float);public void DrawArc (Pen, int, int, int, int, int, int);public void DrawArc (Pen, float, float, float, float, float, float); Rectangle (oppure le sue coordinate) circoscrivel’ellisse il cui arco è dato da un angoloiniziale e da un angolo di spostamento. |
- DrawEllipse | Il metodo permette di disegnare un’ellisse;è sovraccaricato:public void DrawEllipse (Pen, Rectangle);public void DrawEllipse (Pen, RectangleF);public void DrawEllipse (Pen, int, int, int, int);public void DrawEllipse (Pen, float, float, float, float); Rectangle (oppure le sue coordinate) circoscrivel’ellisse. |
- DrawLine | Il metodo permette di disegnare una linea che collegadue punti; è sovraccaricato:public void DrawLine (Pen, Point, Point);public void DrawLine (Pen, PointF, PointF);public void DrawLine (Pen, int, int, int, int);public void DrawLine (Pen, float, float, float, float); |
- DrawPie | Il metodo permette di disegnare il contorno di unospicchio di cerchio definito da un’elisse e dadue linee radiali; è sovraccaricato:public void DrawPie (Pen, Rectangle, float, float);public void DrawPie (Pen, Rectangle, float, float);public void DrawPie (Pen, int, int, int, int, int, int);public void DrawPie (Pen, float, float, float, float); Rectangle (oppure le sue coordinate) circoscrivel’ellisse. |
- DrawPolygon | Il metodo permette di disegnare il contorno di poligonodefinito da un’array di punti due; il metodoè sovraccaricato:public void DrawPolygon (Pen, Point[]);public void DrawPolygon (Pen, PointF[]); |
- DrawRectangle | Il metodo permette di disegnare il contorno di unorettangolo; è sovraccaricato:public void DrawRectangle (Pen, Rectangle);public void DrawRectangle (Pen, int, int, int, int);public void DrawRectangle (Pen, float, float, float); |
- DrawString | Il metodo permette di disegnare una stringa; èsovraccaricato:public void DrawString (string, Font, Brush, PointF);public void DrawString (string, Font, Brush, RectangleF);public void DrawString (string, Font, Brush, float, float);public void DrawString (string, Font, Brush, PointF, StringFormat);public void DrawString (string, Font, Brush, RectangleF, StringFormat);public void DrawString (string, Font, Brush, float, float, StringFormat); Il metodo richiede sempre una stringa, un font ed unpennello. Altri parametri possono essere le coordinatedi inizio stringa ed il formato della stringa. |
- FillEllipse | Il metodo permette di riempire la parte interna diun’ellisse; è sovraccaricato:public void FillEllipse (Brush, Rectangle);public void FillEllipse (Brush, RectangleF);public void FillEllipse (Brush, int, int, int, int);public void FillEllipse (Brush, float, float, float, float); Il rettangolo (o le sue coordinate) circoscrivel’ellisse. |
- FillPie | Il metodo permette di riempire la parte interna di uno spicchio di cerchio definito da un’ellisse e da due linee radiali; è sovraccaricato: public void FillPie (Brush, Rectangle, float, float);public void FillPie (Brush, float, float, float, float, float, float);public void FillPie (Brush, int, int, int, int, int int); |
- FillPolygon | Il metodo permette di riempire la parte interna dipoligono definito da un’array di punti; èsovraccaricato:public void FillPolygon (Brush, Point []);public void FillPolygon (Brush, PointF[]);public void FillPolygon (Brush, Point[], FillMode);public void FillPolygon (Brush, PointF[], FillMode); |
- FillRectangle | Il metodo permette di riempire la parte interna di unrettangolo con un colore dato, il colore di riempimentoè definito un pennello; il metodo èsovraccaricato:public void FillRectangle (Brush, RectangleF);public void FillRectangle (Brush, Rectangle);public void FillRectangle (Brush, float, float, float, float);public void FillRectangle (Brush, int, int, int, int); |
Molti dei metodi su esposti accettano come parametri oltreche un oggetto Paint o Brush anche un oggetto Point oRectangle.
Un oggetto Point è una coordinata nello spazio a duedimensioni; un oggetto Point può essere, ad esempio,creato invocando il costruttore a due parametri, il primoparametro rappresenta l’ascissa del punto, il secondol’ordinata.
Point myPoint = new Point (1,2);il punto è posizionato alla coordinata (1,2).Un oggetto Rectangle è un rettangolo nello spazio a due dimensioni; un oggetto Rectangle può essere, ad esempio, creato nel seguente modo:Point myPoint = new Point (1,1,10,20);l’angolo superiore sinistro del rettangolo creato è posto alla coordinata (1,1), la larghezza è pari a 10 e l’altezza a 20.Prima di fornire un esempio di utilizzo dei metodi esposti ricordiamo che un evento Paint viene attivato quando cambia la visualizzazione del controllo o del modulo, come conseguenza viene inviato un messaggio (o una chiamata) al metodo OnPaint per il controllo o il modulo; è possibile ridefinire il metodo OnPaint per permettere alle classi di grafica di operare sul modulo.Nel codice seguente viene mostrato come ridefinire il metodo OnPaint:protected override void OnPaint (PaintEventArgs e){ // codice per la creazione della grafica desiderata}
E’ abbastanza semplice costruire un’applicazioneWindows Form che mostri i concetti esposti; ecco un esempiodi ridefinizione del metodo OnPaint in cui vengono disegnatiuna linea, e due rettangoli.
protected override void OnPaint(PaintEventArgs e){ Graphics g = e.Graphics; //Disegna una linea rossa Pen redPen = new Pen(Color.Red); g.DrawLine(redPen,10,20,50,20); redPen.Dispose(); //Disegna un rettangolo (solo i contorni) Pen greenPen = new Pen(Color.Green); greenPen.DashStyle = DashStyle.DashDot; g.DrawRectangle(greenPen,80,10,90,20); greenPen.Dispose(); //Disegna un rettangolo riempito Brush yellowBrush = new SolidBrush(Color.Yellow); g.FillRectangle(yellowBrush,10,40,40,30); yellowBrush.Dispose();}