Gestione dello stato di un oggetto Graphics

La Graphics classe è al centro di GDI+. Per disegnare qualsiasi elemento, si ottiene un Graphics oggetto, si impostano le relative proprietà e si chiamano i relativi metodi DrawLine, DrawImage, DrawStringe simili.

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

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 grafica

Un Graphics oggetto non fornisce metodi di disegno, ad esempio DrawLine e DrawRectangle. Un Graphics oggetto mantiene anche lo stato grafico, che può essere suddiviso nelle categorie seguenti:

  • Impostazioni di qualità

  • Trasformazioni

  • Area di ritaglio

Impostazioni di qualità

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

L'esempio seguente disegna due puntini di sospensione, uno con la modalità smoothing impostato su AntiAlias e uno con la modalità smoothing 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 Graphics oggetto gestisce due trasformazioni (mondo e pagina) applicate a tutti gli elementi disegnati da tale Graphics oggetto. 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 pagina può essere usata per il ridimensionamento e per le unità di modifica ( ad esempio, pixel in pollici). Per altre informazioni, vedere Sistemi di coordinate e trasformazioni.

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

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 i due puntini di sospensione. Si noti che la rotazione a 30 gradi riguarda l'origine del sistema di coordinate (angolo superiore sinistro dell'area client), non sui centri dei puntini di sospensione. Si noti anche che la larghezza della penna di 1 indica 1 pixel per il primo ellisse e 1 millimetri per il secondo ellisse.

Illustration that shows two ellipses: rotation and pen width.

Ritaglio area

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

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 Graphics oggetto . Il codice disegna quindi due righe 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 ritagliate:

Diagram that shows the limited clip region.

Vedi anche