Zarządzanie stanem obiektu graficznego

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

Poniższy przykład wywołuje DrawRectangle metodę Graphics obiektu. Pierwszym argumentem przekazanym DrawRectanglePen do metody jest obiekt.

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 wykonuje więcej niż 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

  • Przycinanie regionu

Ustawienia jakości

Obiekt Graphics ma kilka właściwości mających wpływ na jakość elementów, które są rysowane. Na przykład można ustawić TextRenderingHint właściwość , 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 Graphics obiekt. Każda transformacja affine może być przechowywana w transformacji świata. Przekształcenia affiny obejmują skalowanie, obracanie, odzwierciedlanie, niesymetryczność i tłumaczenie. Transformacja strony może służyć do skalowania i zmieniania jednostek (na przykład pikseli na cale). Aby uzyskać więcej informacji, zobacz Koordynowanie systemów i przekształceń.

W poniższym przykładzie ustawiono przekształcenia Graphics świata i strony obiektu. Transformacja świata jest ustawiona na rotację 30 stopni. Przekształcenie strony jest ustawione tak, aby współrzędne przekazywane do sekundy DrawEllipse były traktowane jako milimetry zamiast pikseli. Kod wykonuje dwa identyczne wywołania DrawEllipse metody . Transformacja świata jest stosowana do pierwszego DrawEllipse wywołania, a oba przekształcenia (świat i strona) są stosowane do drugiego DrawEllipse wywołania.

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 dwa wielokropki. Należy pamiętać, że rotacja 30 stopni dotyczy źródła układu współrzędnych (lewego górnego rogu obszaru klienta), a nie o centrach wielokropka. Należy również zauważyć, że szerokość pióra 1 oznacza 1 piksel dla pierwszego wielokropka i 1 milimetra dla drugiego wielokropka.

Illustration that shows two ellipses: rotation and pen width.

Przycinanie regionu

Obiekt Graphics utrzymuje region wycinków, który ma zastosowanie do wszystkich elementów rysowanych przez ten Graphics obiekt. 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 Graphics przycinania obiektu. Następnie kod rysuje dwa wiersze, które są ograniczone do wnętrza regionu 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 that shows the limited clip region.

Zobacz też