Lo stato di un oggetto Graphics

La classe Graphics è un elemento essenziale di GDI+. Per disegnare qualunque elemento, è necessario ottenere un oggetto Graphics, impostarne le proprietà e chiamarne i metodi, ad esempio DrawLine, DrawImage e DrawString.

Nell'esempio che segue viene chiamato il metodo DrawRectangle di un oggetto Graphics. Il primo argomento passato al metodo DrawRectangle è un oggetto Pen.

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue) ' Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100)
[C#]
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Blue);  // Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100);

Stato graphics

In un oggetto Graphics non vengono solo forniti metodi per il disegno, come DrawLine e DrawRectangle, ma viene anche conservato lo stato graphics, che può essere suddiviso nelle seguenti categorie:

  • Impostazioni di qualità
  • Trasformazioni
  • Area di ridimensionamento

Impostazioni di qualità

Con un oggetto Graphics si dispone di numerose proprietà che consentono di influenzare la qualità degli elementi disegnati. È possibile ad esempio impostare la proprietà TextRenderingHint per specificare il tipo dell'eventuale antialias applicato al testo. Altre proprietà che consentono di influire sulla qualità sono SmoothingMode, CompositingMode, CompositingQuality e InterpolationMode.

Nell'esempio che segue vengono disegnati due ellissi, una con modalità di smussatura impostata su AntiAlias e una con la stessa modalità impostata su HighSpeed:

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue)
      
graphics.SmoothingMode = SmoothingMode.AntiAlias
graphics.DrawEllipse(pen, 0, 0, 200, 100)
graphics.SmoothingMode = SmoothingMode.HighSpeed
graphics.DrawEllipse(pen, 0, 150, 200, 100)
[C#]
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Blue);

graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawEllipse(pen, 0, 0, 200, 100);
graphics.SmoothingMode = SmoothingMode.HighSpeed;
graphics.DrawEllipse(pen, 0, 150, 200, 100);

Trasformazioni

In un oggetto Graphics è possibile gestire due trasformazioni, world e page, che si applicano a tutti gli elementi disegnati tramite l'oggetto stesso. Qualsiasi trasformazione affine può essere memorizzata nella trasformazione world. Esempi di trasformazioni affini comprendono rotazione, creazione di un riflesso, inclinazione e traslazione. La trasformazione page può essere utilizzata per l'adattamento e per la modifica delle unità, ad esempio da pixel a pollici. Per ulteriori informazioni, vedere Sistemi di coordinate e trasformazioni.

Nell'esempio che segue si impostano le trasformazioni di tipo world e di tipo page di un oggetto Graphics. La trasformazione world viene impostata su una rotazione di 30 gradi. La trasformazione page viene impostata in modo che le coordinate passate al secondo DrawEllipse siano considerate come espresse in millimetri anziché in pixel. Vengono effettuate due chiamate al metodo DrawEllipse identiche. La trasformazione di tipo world viene applicata durante la prima chiamata a DrawEllipse; con la seconda chiamata a DrawEllipse sono applicate entrambe le trasformazioni.

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Red)
      
graphics.ResetTransform()
graphics.RotateTransform(30) ' world transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50)
graphics.PageUnit = GraphicsUnit.Millimeter ' page transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50)
[C#]
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Red); 

graphics.ResetTransform();
graphics.RotateTransform(30);                    // world transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50);
graphics.PageUnit = GraphicsUnit.Millimeter;     // page transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50);

Nell'illustrazione che segue sono mostrate le due ellissi. Si noti che la rotazione di 30 gradi avviene rispetto all'origine del sistema di coordinate (angolo in alto a sinistra dell'area client), anziché rispetto al centro delle ellissi. Si noti inoltre che la larghezza della penna, pari a 1, indica 1 pixel per la prima ellisse e 1 millimetro per la seconda.

Area di ridimensionamento

Tramite un oggetto Graphics è possibile gestire un'area di ridimensionamento che si applica a tutti gli elementi disegnati dall'oggetto stesso. È possibile impostare tale area chiamando il metodo SetClip.

Nell'esempio che segue si crea un'area a forma di segno più tramite l'unione di due rettangoli. Tale area è designata come area di ridimensionamento di un oggetto Graphics. Quindi vengono disegnate due linee limitate dall'interno dell'area.

Dim graphics As Graphics = e.Graphics
      
' Opaque red, width 5
Dim pen As New Pen(Color.Red, 5)
      
' Opaque aqua
Dim brush As New SolidBrush(Color.FromArgb(255, 180, 255, 255))
      
' Create a plus-shaped region by forming the union of two rectangles.
Dim [region] As New [Region](New Rectangle(50, 0, 50, 150))
[region].Union(New Rectangle(0, 50, 150, 50))
graphics.FillRegion(brush, [region])
      
' Set the clipping region.
graphics.SetClip([region], CombineMode.Replace)
      
' Draw two clipped lines.
graphics.DrawLine(pen, 0, 30, 150, 160)
graphics.DrawLine(pen, 40, 20, 190, 150)
[C#]
Graphics graphics = e.Graphics;

// Opaque red, width 5
Pen pen = new Pen(Color.Red, 5);  

// Opaque aqua
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 180, 255, 255));  

// Create a plus-shaped region by forming the union of two rectangles.
Region region = new Region(new Rectangle(50, 0, 50, 150));
region.Union(new Rectangle(0, 50, 150, 50));
graphics.FillRegion(brush, region);

// Set the clipping region.
graphics.SetClip(region, CombineMode.Replace);

// Draw two clipped lines.
graphics.DrawLine(pen, 0, 30, 150, 160);
graphics.DrawLine(pen, 40, 20, 190, 150);

Nell'illustrazione che segue sono mostrate le linee tagliate.