背景
路径是一系列相互连接的直线和曲线,由许多不同类型的点所构成,用于表示复杂的不规则图形, GraphicsPath 类表示。要绘制一组图形,如线条、 矩形、多边形和曲线等,可以通过 Graphcis 类的 DrawPath 方法一次性绘制。
构造路径
①.通过添加图形构造
一般先构造一个空路径,然后调用其 Addxxx 方法来分别添加需要的图形。
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue,2);
GraphicsPath m_Path;//构造空路径
m_Path.AddLine(10, 30, 50, 30);//添加直线
m_Path.AddEllipse(30, 30, 80, 60);//添加椭圆
graphics.DrawPath(&m_pen, &m_Path);//路径绘制
}
②.通过点构造
路径是一系列相互连接的直线和曲线,它们最终都是由有序点列所组成,但这里的点不光指其坐标位置,还包括点的类型。主要的点类型有起点、直线端点、贝塞尔点、标记点和闭子路径终点,其他曲线类型(如弧、椭圆和基数样条曲线等)在路径中都是用贝塞尔曲线来表示的。
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue,2);
Point points[] = { Point(40, 60), Point(275, 200), Point(105, 225),Point(190, 300), Point(50, 350), Point(20, 180) };
BYTE types[] = { PathPointTypeStart, PathPointTypeBezier,PathPointTypeBezier, PathPointTypeBezier, PathPointTypeLine,PathPointTypeLine };
GraphicsPath m_Path(points,types,6);//通过点构造路径
graphics.DrawPath(&m_pen, &m_Path);//路径绘制
}
③.获取路径点信息
在创建路径并添加各种几何图形或字符串之后,我们可以调用如下一些 GraphicsPath 类的成员函数,来获取路径中的点的信息。获取的点信息可以用于路径重构。
int n = m_Path.GetPointCount(); // 获取路径中的点数
PointF *points = new PointF[n]; // 动态创建点数组
m_Path.GetPathPoints(points, n); // 获取路径的点数组
BYTE *types = new BYTE[n]; // 动态创建类型数组
m_Path.GetPathTypes(types, n); // 获取路径类型数组
路径绘制
①.概述
缺省情况下路径中每个被加入的闭图形(如矩形、椭圆、多边形、饼、闭基数样条曲线等)都是一个子路径;而连续加入的所有开图形(如直线、折线、弧等)共同构成一个子路径。
②.绘制路径
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue,2);
GraphicsPath m_Path;//构造空路径
m_Path.AddLine(10, 30, 50, 30);//添加直线
m_Path.AddLine(20, 10, 20, 60);//添加直线
m_Path.AddEllipse(30, 30, 80, 60);//添加椭圆
graphics.DrawPath(&m_pen, &m_Path);//路径绘制
}
③.开始新的子路径
利用 GraphicsPath 类的成员函数:StartFigure 或者 CloseFigure 开始新子路径,其中 CloseFigure 先关闭当前子路径,再开始新子路径 。
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue,2);
GraphicsPath m_Path;//构造空路径
m_Path.AddLine(10, 30, 50, 30);//添加直线
m_Path.StartFigure();
m_Path.AddLine(20, 10, 20, 60);//添加直线
m_Path.AddEllipse(30, 30, 80, 60);//添加椭圆
graphics.DrawPath(&m_pen, &m_Path);//路径绘制
}
④.填充路径
使用 Graphics 类的成员函数 FillPath 可以填充路径,填充时会把开路径自动闭合再填充。
void DemoGDI::DrawUser(HDC hdc)
{
Graphics graphics(hdc);//构造 Graphics 对象
Pen m_pen(Color::Blue,2);
SolidBrush m_Brush(Color::Green);
GraphicsPath m_Path;//构造空路径
m_Path.AddLine(10, 30, 50, 30);//添加直线
m_Path.AddLine(20, 10, 20, 60);//添加直线
m_Path.AddEllipse(30, 30, 80, 60);//添加椭圆
graphics.DrawPath(&m_pen, &m_Path);//路径绘制
graphics.FillPath(&m_Brush, &m_Path);
}