Sdílet prostřednictvím


Správa stavu grafického objektu

Třída Graphics je jádrem GDI+. Pokud chcete nakreslit cokoli, získáte objekt Graphics, nastavíte jeho vlastnosti a zavoláte jeho metody DrawLine, DrawImage, DrawStringa podobně).

Příklad níže volá metodu DrawRectangle u objektu Graphics. První argument předaný metodě DrawRectangle je objekt 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);  

Grafický stav

Objekt Graphics poskytuje více než metody kreslení, jako jsou DrawLine a DrawRectangle. Objekt Graphics také udržuje grafický stav, který lze rozdělit do následujících kategorií:

  • Nastavení kvality

  • Transformace

  • Výřez oblasti

Nastavení kvality

Objekt Graphics má několik vlastností, které ovlivňují kvalitu nakreslených položek. Můžete například nastavit vlastnost TextRenderingHint, která určuje typ antialiasingu (pokud existuje) použitý u textu. Další vlastnosti, které ovlivňují kvalitu, jsou SmoothingMode, CompositingMode, CompositingQualitya InterpolationMode.

Následující příklad nakreslí dvě elipsy, jedna s režimem vyhlazování nastaveným na AntiAlias a druhá s režimem vyhlazování nastaveným 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);  

Transformace

Objekt Graphics udržuje dvě transformace (svět a stránku), které se použijí u všech položek nakreslených tímto objektem Graphics. Všechny affinové transformace mohou být uloženy ve světové transformaci. Afinní transformace zahrnují škálování, otáčení, odrážení, zkosení a posunutí. Transformace stránky se dá použít pro škálování a změnu jednotek (například pixely na palce). Další informace viz část Souřadnicové systémy a transformace.

Následující příklad nastaví svět a transformace stránky objektu Graphics. Světová transformace je nastavená na otočení o 30 stupňů. Transformace stránky je nastavená tak, aby souřadnice předané druhému DrawEllipse byly považovány za milimetry místo pixelů. Kód provádí dvě identická volání metody DrawEllipse. Světová transformace se použije na první volání DrawEllipse a obě transformace (světová a stránková) se použijí na druhé volání 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);  

Následující obrázek znázorňuje dva elipsy. Všimněte si, že otočení o 30 stupňů je kolem původu souřadnicového systému (levý horní roh klientské oblasti), ne kolem středů elips. Všimněte si také, že šířka pera 1 znamená 1 pixel pro první elipsu a 1 milimetr pro druhou elipsu.

Ilustrace ukazující dvě elipsy: otočení a šířka pera.

Ořezová oblast

Objekt Graphics udržuje oblast výřezu, která se vztahuje na všechny položky nakreslené tímto Graphics objektem. Oblast výřezu můžete nastavit voláním metody SetClip.

Následující příklad vytvoří oblast ve tvaru plus vytvořením sjednocení dvou obdélníků. Tato oblast je určena jako ořezová oblast objektu Graphics. Pak kód nakreslí dva řádky, které jsou omezeny na vnitřní část oblasti výřezu.

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

Následující obrázek znázorňuje oříznuté čáry:

Diagram znázorňující omezenou oblast klipů

Viz také