Files
docs-desktop/dotnet-desktop-guide/framework/winforms/advanced/managing-the-state-of-a-graphics-object.md
Andy De George c0ba284473 Initial winforms content migrated (#18)
* Merge winforms framework content to working branch (#14)

* Breadcrumb / TOC / Move net5 to net folder (#15)

* change path from net5 to net

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Mess with bread/toc

* Add .net 5 winforms placeholder article (#16)

* added some metadata and adjusted net5 placeholder

* corrections

* corrections

* corrections

* Test1

* Swapping landing page vs concept

* fix links

* Fix links

* Fix desc
2020-09-01 16:26:21 -07:00

7.4 KiB

title, ms.date, dev_langs, helpviewer_keywords, ms.assetid
title ms.date dev_langs helpviewer_keywords ms.assetid
Managing the State of a Graphics Object 03/30/2017
csharp
vb
graphics [Windows Forms], managing state
graphics [Windows Forms], clipping
6207cad1-7a34-4bd6-bfc1-db823ca7a73e

Managing the State of a Graphics Object

The xref:System.Drawing.Graphics class is at the heart of GDI+. To draw anything, you obtain a xref:System.Drawing.Graphics object, set its properties, and call its methods xref:System.Drawing.Graphics.DrawLine%2A, xref:System.Drawing.Graphics.DrawImage%2A, xref:System.Drawing.Graphics.DrawString%2A, and the like).

The following example calls the xref:System.Drawing.Graphics.DrawRectangle%2A method of a xref:System.Drawing.Graphics object. The first argument passed to the xref:System.Drawing.Graphics.DrawRectangle%2A method is a xref:System.Drawing.Pen object.

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

Graphics State

A xref:System.Drawing.Graphics object does more than provide drawing methods, such as xref:System.Drawing.Graphics.DrawLine%2A and xref:System.Drawing.Graphics.DrawRectangle%2A. A xref:System.Drawing.Graphics object also maintains graphics state, which can be divided into the following categories:

  • Quality settings

  • Transformations

  • Clipping region

Quality Settings

A xref:System.Drawing.Graphics object has several properties that influence the quality of the items that are drawn. For example, you can set the xref:System.Drawing.Graphics.TextRenderingHint%2A property to specify the type of antialiasing (if any) applied to text. Other properties that influence quality are xref:System.Drawing.Graphics.SmoothingMode%2A, xref:System.Drawing.Graphics.CompositingMode%2A, xref:System.Drawing.Graphics.CompositingQuality%2A, and xref:System.Drawing.Graphics.InterpolationMode%2A.

The following example draws two ellipses, one with the smoothing mode set to xref:System.Drawing.Drawing2D.SmoothingMode.AntiAlias and one with the smoothing mode set to xref:System.Drawing.Drawing2D.SmoothingMode.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);  

Transformations

A xref:System.Drawing.Graphics object maintains two transformations (world and page) that are applied to all items drawn by that xref:System.Drawing.Graphics object. Any affine transformation can be stored in the world transformation. Affine transformations include scaling, rotating, reflecting, skewing, and translating. The page transformation can be used for scaling and for changing units (for example, pixels to inches). For more information, see Coordinate Systems and Transformations.

The following example sets the world and page transformations of a xref:System.Drawing.Graphics object. The world transformation is set to a 30-degree rotation. The page transformation is set so that the coordinates passed to the second xref:System.Drawing.Graphics.DrawEllipse%2A will be treated as millimeters instead of pixels. The code makes two identical calls to the xref:System.Drawing.Graphics.DrawEllipse%2A method. The world transformation is applied to the first xref:System.Drawing.Graphics.DrawEllipse%2A call, and both transformations (world and page) are applied to the second xref:System.Drawing.Graphics.DrawEllipse%2A call.

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

The following illustration shows the two ellipses. Note that the 30-degree rotation is about the origin of the coordinate system (upper-left corner of the client area), not about the centers of the ellipses. Also note that the pen width of 1 means 1 pixel for the first ellipse and 1 millimeter for the second ellipse.

Illustration that shows two ellipses: rotation and pen width.

Clipping Region

A xref:System.Drawing.Graphics object maintains a clipping region that applies to all items drawn by that xref:System.Drawing.Graphics object. You can set the clipping region by calling the xref:System.Drawing.Graphics.SetClip%2A method.

The following example creates a plus-shaped region by forming the union of two rectangles. That region is designated as the clipping region of a xref:System.Drawing.Graphics object. Then the code draws two lines that are restricted to the interior of the clipping region.

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

The following illustration shows the clipped lines:

Diagram that shows the limited clip region.

See also