图形对象的状态

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

以下示例构造一个 Graphics 对象和一个 Pen 对象,然后调用 Graphics 对象的 Graphics::D rawRectangle 方法:

HDC          hdc;
PAINTSTRUCT  ps;

hdc = BeginPaint(hWnd, &ps);
{
   Graphics graphics(hdc);
   Pen pen(Color(255, 0, 0, 255));  // opaque blue
   graphics.DrawRectangle(&pen, 10, 10, 200, 100);
}
EndPaint(hWnd, &ps);

在前面的代码中, BeginPaint 方法返回设备上下文的句柄,并将该句柄传递给 Graphics 构造函数。 设备上下文是由 Windows) 维护 (的结构,用于保存有关正在使用的特定显示设备的信息。

图形状态

Graphics 对象的作用不仅仅是提供绘图方法,如 DrawLineDrawRectangleGraphics 对象还维护图形状态,可将其划分为以下类别:

  • 指向设备上下文的链接
  • 质量设置
  • 转换
  • 剪辑区域

设备上下文

作为应用程序程序员,你不必考虑 Graphics 对象与其设备上下文之间的交互。 此交互由 GDI+ 后台处理。

质量设置

Graphics 对象具有多个属性,这些属性会影响在屏幕上绘制的项目的质量。 可以通过调用 get 和 set 方法来查看和操作这些属性。 例如,可以调用 Graphics::SetTextRenderingHint 方法指定抗锯齿 (类型(如果任何) 应用于文本)。 其他影响质量的设置方法包括 Graphics::SetSmoothingModeGraphics::SetCompositingModeGraphics::SetCompositingQualityGraphics::SetInterpolationMode

以下示例绘制两个省略号,一个将平滑模式设置为 SmoothingModeAntiAlias ,一个将平滑模式设置为 SmoothingModeHighSpeed

Graphics graphics(hdc);
Pen pen(Color(255, 0, 255, 0));  // opaque green

graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.DrawEllipse(&pen, 0, 0, 200, 100);
graphics.SetSmoothingMode(SmoothingModeHighSpeed);
graphics.DrawEllipse(&pen, 0, 150, 200, 100);

转换

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

以下示例设置 Graphics 对象的世界和页面转换。 世界转换设置为旋转 30 度。 设置页面转换,以便传递给第二个 Graphics::D rawEllipse 的坐标将被视为毫米而不是像素。 代码对 Graphics::D rawEllipse 方法进行两次相同的调用。 世界转换应用于第一个 Graphics::D rawEllipse 调用, (world 和 page) 的转换将应用于第二个 Graphics::D rawEllipse 调用。

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0));

graphics.ResetTransform();
graphics.RotateTransform(30.0f);            // World transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);
graphics.SetPageUnit(UnitMillimeter);       // Page transformation
graphics.DrawEllipse(&pen, 30, 0, 50, 25);

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

窗口的屏幕截图,其中包含一个小的细椭圆和一个大的较粗椭圆

 

剪切区域

Graphics 对象维护应用于该 Graphics 对象绘制的所有项的剪裁区域。 可以通过调用 SetClip 方法设置剪辑区域。

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

Graphics graphics(hdc);
Pen pen(Color(255, 255, 0, 0), 5);  // opaque red, width 5
SolidBrush brush(Color(255, 180, 255, 255));  // opaque aqua

// Create a plus-shaped region by forming the union of two rectangles.
Region region(Rect(50, 0, 50, 150));
region.Union(Rect(0, 50, 150, 50));
graphics.FillRegion(&brush, &region);

// Set the clipping region.
graphics.SetClip(&region);

// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);

下图显示了剪裁的线条。

显示由两条对角线红线交叉的彩色形状的插图