管理 Graphics 对象的状态

Graphics 类是 GDI+ 的核心。 若要绘制任何内容,需获取一个 Graphics 对象,设置其属性,并调用其方法(DrawLineDrawImageDrawString 等)。

以下示例调用 Graphics 对象的 DrawRectangle 方法。 传递给 DrawRectangle 方法的第一个参数是 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);  

图形状态

Graphics 对象不只是提供绘图方法,例如 DrawLineDrawRectangleGraphics 对象还会维护图形状态,可分为以下几类:

  • 质量设置

  • 转换

  • 剪切区域

质量设置

Graphics 对象具有多个属性,这些属性会影响所绘制的项的质量。 例如,可以设置 TextRenderingHint 属性以指定应用于文本的抗锯齿类型(如果有)。 影响质量的其他属性包括 SmoothingModeCompositingModeCompositingQualityInterpolationMode

以下示例绘制两个椭圆,其中一个将平滑模式设置为 AntiAlias,另一个将平滑模式设置为 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);  

转换

Graphics 对象维护两个转换(世界和页面),这两个转换应用到由该 Graphics 对象绘制的所有项。 任何仿射变换均可存储在世界转换中。 仿射变换包括缩放、旋转、反射、倾斜和平移。 页面转换可用于缩放和更改单位(例如,像素到英寸)。 有关详细信息,请参阅坐标系和变换

以下示例设置 Graphics 对象的世界和页面转换。 世界转换设置为旋转 30 度。 设置页面转换,以便将传递给第二个 DrawEllipse 的坐标看作毫米而不是像素。 该代码对 DrawEllipse 方法进行了两次相同的调用。 世界转换应用于第一个 DrawEllipse 调用,而两个转换(世界和页面)均应用于第二个 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);  

下图显示两个椭圆。 请注意,旋转 30 度是基于坐标系的原点(工作区的左上角),而不是基于椭圆的圆心。 另请注意,笔宽为 1 表示左上角椭圆的像素为 1,右下角椭圆的宽度为 1 毫米。

Illustration that shows two ellipses: rotation and pen width.

剪切区域

Graphics 对象维护剪切区域,该区域适用于由该 Graphics 对象绘制的所有项。 可通过调用 SetClip 方法来设置剪切区域。

以下示例通过形成两个矩形的并集来创建加号形状区域。 该区域被指定为 Graphics 对象的剪切区域。 然后,代码将绘制两条限制在剪切区域内部的线。

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

下图显示两条经过剪切的线:

Diagram that shows the limited clip region.

另请参阅