图形对象的状态
Graphics 类是 Windows GDI+ 的核心。 若要绘制任何内容,请创建 一个 Graphics 对象,设置其属性,并调用其方法 ( DrawLine、 DrawImage、 DrawString 等) 。
以下示例构造一个 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 对象的作用不仅仅是提供绘图方法,如 DrawLine 和 DrawRectangle。 Graphics 对象还维护图形状态,可将其划分为以下类别:
- 指向设备上下文的链接
- 质量设置
- 转换
- 剪辑区域
设备上下文
作为应用程序程序员,你不必考虑 Graphics 对象与其设备上下文之间的交互。 此交互由 GDI+ 后台处理。
质量设置
Graphics 对象具有多个属性,这些属性会影响在屏幕上绘制的项目的质量。 可以通过调用 get 和 set 方法来查看和操作这些属性。 例如,可以调用 Graphics::SetTextRenderingHint 方法指定抗锯齿 (类型(如果任何) 应用于文本)。 其他影响质量的设置方法包括 Graphics::SetSmoothingMode、 Graphics::SetCompositingMode、 Graphics::SetCompositingQuality 和 Graphics::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, ®ion);
// Set the clipping region.
graphics.SetClip(®ion);
// Draw two clipped lines.
graphics.DrawLine(&pen, 0, 30, 150, 160);
graphics.DrawLine(&pen, 40, 20, 190, 150);
下图显示了剪裁的线条。