Condividi tramite


Gestione dello stato di un oggetto grafico

La classe Graphics è al centro di GDI+. Per disegnare qualsiasi elemento, ottenere un oggetto Graphics, impostarne le proprietà e chiamare i relativi metodi DrawLine, DrawImage, DrawStringe simili).

Nell'esempio seguente 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)  
Graphics graphics = e.Graphics;  
Pen pen = new Pen(Color.Blue);  // Opaque blue  
graphics.DrawRectangle(pen, 10, 10, 200, 100);  

Stato grafico

Un oggetto Graphics fa più che fornire solo metodi di disegno, come DrawLine e DrawRectangle. Un oggetto Graphics mantiene anche lo stato grafico, che può essere suddiviso nelle categorie seguenti:

  • Impostazioni di qualità

  • Trasformazioni

  • Area di ritaglio

Impostazioni di qualità

Un oggetto Graphics ha diverse proprietà che influiscono sulla qualità degli elementi disegnati. Ad esempio, è possibile impostare la proprietà TextRenderingHint per specificare il tipo di antialiasing (se presente) applicato al testo. Altre proprietà che influenzano la qualità sono SmoothingMode, CompositingMode, CompositingQualitye InterpolationMode.

Nell'esempio seguente vengono tracciate due ellissi, una con la modalità di smussatura impostata su AntiAlias e una con la modalità di smussatura 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)  
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

Un oggetto Graphics gestisce due trasformazioni (mondo e pagina) applicate a tutti gli elementi disegnati da tale oggetto Graphics. Qualsiasi trasformazione affine può essere archiviata nella trasformazione globale. Le trasformazioni affine includono la scalabilità, la rotazione, la riflessione, l'asimmetria e la traduzione. La trasformazione della pagina può essere usata per il ridimensionamento e per la conversione di unità (ad esempio, da pixel a pollici). Per ulteriori informazioni, vedere Sistemi di Coordinate e Trasformazioni.

Nell'esempio seguente si impostano le trasformazioni del mondo e della pagina di un oggetto Graphics. La trasformazione globale è impostata su una rotazione a 30 gradi. La trasformazione della pagina è impostata in modo che le coordinate passate al secondo DrawEllipse saranno considerate come millimetri anziché pixel. Il codice esegue due chiamate identiche al metodo DrawEllipse. La trasformazione globale viene applicata alla prima chiamata DrawEllipse e entrambe le trasformazioni (mondo e pagina) vengono applicate alla seconda chiamata DrawEllipse.

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)  
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);  

La figura seguente mostra le due ellissi. Si noti che la rotazione di 30 gradi riguarda l'origine del sistema di coordinate (angolo superiore sinistro dell'area client), non i centri delle ellissi. Si noti anche che una larghezza di penna di 1 indica 1 pixel per la prima ellisse e 1 millimetro per la seconda ellisse.

Illustrazione che mostra due ellissi: rotazione e larghezza del tratto.

Regione di ritaglio

Un oggetto Graphics mantiene un'area di ritaglio che si applica a tutti gli elementi disegnati da tale oggetto Graphics. È possibile impostare l'area di ritaglio chiamando il metodo SetClip.

Nell'esempio seguente viene creata un'area con più forme formando l'unione di due rettangoli. Tale area è designata come area di ritaglio di un oggetto Graphics. Il codice quindi disegna due linee limitate all'interno dell'area di ritaglio.

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)  
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);  

La figura seguente mostra le linee tagliate.

Diagramma che mostra l'area di ritaglio limitata.

Vedere anche