Zarządzanie stanem obiektu graficznego
Klasa Graphics jest w centrum 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 metodę DrawRectangleGraphics obiektu. Pierwszym argumentem przekazanym Pen do DrawRectangle 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ż metody rysunku, takie jak DrawLine i DrawRectangle. Graphics Obiekt zachowuje również stan grafiki, który można podzielić na następujące kategorie:
Ustawienia jakości
Przekształcenia
Region przycinania
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ść tak, 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
Graphics Obiekt 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 Affine obejmują skalowanie, obracanie, odzwierciedlanie, niesymetryczność i tłumaczenie. Przekształcanie strony może służyć do skalowania i zmieniania jednostek (na przykład pikseli do cali). Aby uzyskać więcej informacji, zobacz Współrzędne systemy i przekształcenia.
Poniższy przykład ustawia przekształcenia Graphics świata i strony obiektu. Transformacja świata jest ustawiona na 30-stopniową rotację. Transformacja strony jest ustawiana tak, aby współrzędne przekazywane do drugiego 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 wielokropek. Należy pamiętać, że rotacja 30 stopni dotyczy pochodzenia 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 milimetr dla drugiego wielokropka.

Region przycinania
Obiekt Graphics zachowuje region wycinków, który ma zastosowanie do wszystkich elementów rysowanych przez ten Graphics obiekt. Region przycinania można ustawić, wywołując metodę SetClip .
Poniższy przykład tworzy region o 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 wycinki.
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 przycięte linie:
