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.
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:
Zobacz też
- grafiki i rysunku w formularzy systemu Windows
- Przy Użyciu Zagnieżdżonych Kontenerów Graficznych
.NET Desktop feedback