Udostępnij za pośrednictwem


Zarządzanie stanem obiektu graficznego

Klasa Graphics jest sercem interfejsu GDI+. Aby rysować wszystko, uzyskujesz obiekt Graphics, ustawiasz jego właściwości i wywołujesz metody DrawLine, DrawImage, DrawStringi podobne).

Poniższy przykład wywołuje metodę DrawRectangle obiektu Graphics. Pierwszym argumentem przekazanym do metody DrawRectangle jest obiekt 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);  

Stan grafiki

Obiekt Graphics nie tylko udostępnia metody rysowania, takie jak DrawLine i DrawRectangle. Obiekt Graphics zachowuje również stan grafiki, który można podzielić na następujące kategorie:

  • Ustawienia jakości

  • Przekształcenia

  • Obszar przycinania

Ustawienia jakości

Obiekt Graphics ma kilka właściwości mających wpływ na jakość elementów, które są rysowane. Można na przykład ustawić właściwość TextRenderingHint, aby określić typ antyaliasingu (jeśli istnieje) zastosowany do tekstu. Inne właściwości wpływające na jakość to SmoothingMode, CompositingMode, CompositingQualityi InterpolationMode.

Poniższy przykład rysuje dwa wielokropki, jeden z trybem wygładzania ustawionym na AntiAlias i jeden z trybem wygładzania ustawionym na 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);  

Przekształcenia

Obiekt Graphics obsługuje dwa przekształcenia (świat i stronę), które są stosowane do wszystkich elementów rysowanych przez ten obiekt Graphics. Każda transformacja afiniczna może być przechowywana w transformacji świata. Przekształcenia afiniczne obejmują skalowanie, obracanie, odbijanie, pochylenie i przesuwanie. Transformacja strony służy do skalowania i zmieniania jednostek (na przykład pikseli na cale). Aby uzyskać więcej informacji, zobacz Coordinate Systems and Transformations.

W poniższym przykładzie ustawia się przekształcenia świata i strony obiektu Graphics. Transformacja świata jest ustawiona na obrót o 30 stopni. Przekształcenie strony ustawiono tak, aby współrzędne przekazywane do drugiego DrawEllipse były traktowane jako milimetry, a nie piksele. Kod wykonuje dwa identyczne wywołania metody DrawEllipse. Transformacja świata jest stosowana do pierwszego wywołania DrawEllipse, a oba przekształcenia (świat i strona) są stosowane do drugiego wywołania 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);  

Na poniższej ilustracji przedstawiono dwie elipsy. Należy pamiętać, że rotacja o 30 stopni dotyczy źródła układu współrzędnych (lewego górnego rogu obszaru klienta), a nie o środkach elips. Należy również zauważyć, że szerokość pióra 1 oznacza 1 piksel dla pierwszej elipsy i 1 milimetr dla drugiej elipsy.

Ilustracja przedstawiająca dwie elipsy: rotację i szerokość pióra.

Obszar przycinania

Obiekt Graphics obsługuje region wycinków, który ma zastosowanie do wszystkich elementów rysowanych przez ten obiekt Graphics. Region wycinków można ustawić, wywołując metodę SetClip.

Poniższy przykład tworzy region w kształcie plusa, tworząc związek dwóch prostokątów. Ten region jest wyznaczony jako region przycinania obiektu Graphics. Następnie kod rysuje dwie linie, które są ograniczone do wnętrza obszaru wycinkowania.

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

Na poniższej ilustracji przedstawiono obcięte linie:

Diagram przedstawiający ograniczony region klipu.

Zobacz też