GDI+高级编程 - 图文

2019-08-03 13:52

第13章 GDI+高级编程*

本章介绍GDI+的路径、区域、变换、图像处理和图元文件等高级编程内容。

路径由许多不同类型的点所构成,用于表示复杂的不规则图形。区域是由矩形、椭圆、多边形等几何形状组合构成的一种封闭图形,可用于复杂图形的绘制、剪裁和击中测试等。Graphics类可对绘制的图形进行平移、旋转和伸缩变换。矩阵类Matrix则可用于图形、图像、颜色、路径、区域等对象的变换。GDI+的图像处理功能强大,可以加载、保存和操作多种格式的图像。GDI+的图元文件格式为EMF+,可用来保存和重放绘图记录,也能用于交互绘图的重绘操作。

13.1 路径

路径(path)是一系列相互连接的直线和曲线,由许多不同类型的点所构成,用于表示复杂的不规则图形,也叫做图形路径(graphics path)。路径可被以画轮廓和填充的形式显示输出,也可以用于创建区域和路径渐变刷等。

虽然在GDI中也有路径(本课件未讲),但是它只是作为DC的一种状态才能存在。独立的路径对象,则是GDI+新增加的。

13.1.1 图形路径

在GDI+中,路径由图形路径类GraphicsPath表示,它是GDI+基类GdiplusBase的直接派生类。

1.构造函数

GraphicsPath类有三个构造函数:

GraphicsPath(FillMode fillMode = FillModeAlternate); // 构造一个空路径

GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fillMode =

FillModeAlternate); // 构造含指定整数型点数组的路径

GraphicsPath(const PointF *points, const BYTE *types, INT count, FillMode fillMode

= FillModeAlternate); // 构造含指定浮数型点数组的路径

1

其中:

? 填充模式参数fillMode在上一章的画填充多边形和曲线时已经讲过,枚举类型

FillMode除了可取这里的默认值FillModeAlternate(交替填充模式)之外,还有一个可取的值是FillModeWinding(环绕替填充模式)。

? 点数组参数points,可以是整数类型的,也可以是浮点数类型的。 ? 点类型数组参数types,主要点类型有路径起点、直线端点和贝塞尔点。

? 计数参数count为数组points和types的元素数,这两种数组中的元素数必须一致。

2.点的种类

构造函数中,点的类型取值为枚举类型PathPointType常量;

typedef enum {

PathPointTypeStart = 0, // 起点 PathPointTypeLine = 1, // 直线端点

PathPointTypeBezier = 3, // 贝塞尔(曲线的控制)点

PathPointTypePathTypeMask = 0x7, // 点类型掩码(只保留低三位) PathPointTypePathDashMode = 0x10, // 未使用

PathPointTypePathMarker = 0x20, // 标记点(用于路径分段) PathPointTypeCloseSubpath = 0x80, // 闭子路径(图形)的终点 PathPointTypeBezier3 = 3 // 同PathPointTypeBezier } PathPointType;

其中,主要的点类型有起点、直线端点、贝塞尔点、标记点和闭子路径终点。其他曲线类型(如弧、椭圆和基样条曲线等)在路径中都是用贝塞尔曲线来表示的。

路径是由点组成的,但这里的点,不光指其坐标位置,还包括点的类型。同样的点坐标,不同的点类型,最后得到的路径可能大相径庭。

例如,同一组点,定义两个路径,一个的点类型全是直线端点,另一个的起点之后有3个贝塞尔点,最后才是两个直线点(参见图13-1,其中自定义画点列函数/方法DrawPoints,在画曲线时用过,源码参见12.6.5的1.):

Point points[] = {Point(40, 140), Point(275, 200),

Point(105, 225), Point(190, 300), Point(50, 350),

2

Point(20, 180)}; // 定义点数组

// 定义点类型数组(为了节省篇幅,有些直接用了枚举的整数值) BYTE lineTypes[] = {PathPointTypeLine, 1, 1, 1, 1, 1}; BYTE types[] = {PathPointTypeStart, PathPointTypeBezier,

3, 3, PathPointTypeLine, 1};

GraphicsPath path1(points, lineTypes, 6), // 创建直线路径

path2(points, types, 6); // 创建复合路径

Graphics graph(pDC->m_hDC); // 创建图形对象 // 填充直线路径、画直线、画点列

graph.FillPath(&SolidBrush(Color::Lime), &path1); graph.DrawLines(&Pen(Color::Violet), points, 6); DrawPoints(graph, Color::Red, 4, points, 6); graph.TranslateTransform(300, 0); // 右移300像素 // 填充复合路径、画直线、画点列

graph.FillPath(&SolidBrush(Color::Aqua), &path2); graph.DrawLines(&Pen(Color::Magenta), points, 6); DrawPoints(graph, Color::Red, 4, points, 6);

图13-1 点类型

3.路径的构成

前面已经讲过,路径是一系列相互连接的直线和曲线,它们最终都是由有序点列所组成。可以利用GraphicsPath类的后两个构造函数,将点数组直接加入路径中。不过,路径中的直线和曲线等图形,一般是通过调用路径类的若干添加图形方法给加进去的。

每个被加入的图形都可以是一个子路径(subpath)。路径对象,会将被加入图形(包括封闭图形)中的点尾首相接,连成一条完整的路径。

3

在路径中的图形都是开图形(起点和终点可能是同一个点,例如矩形、椭圆、多边形和闭曲线等),可以调用图形路径类的CloseFigure或CloseAllFigures方法:

Status CloseFigure(VOID); // 关闭当前子路径 Status CloseAllFigures(VOID); // 关闭所有子路径

来显式闭合路径对象中的当前子路径或所有子路径。

例如(参见图13-2):

Graphics graph(pDC->m_hDC); // 创建图形像对象 Pen pen(Color::Blue); // 定义蓝色笔 GraphicsPath path; // 创建路径对象

path.AddLine(10.0f, 50.0f, 200.0f, 50.0f); // 加水平直线 //path.StartFigure(); // 断开两条直线之间的连接(即分成两个子路径) path.AddLine(60.0f, 10.0f, 60.0f, 80.0f); // 加垂直直线 path.AddEllipse(10, 100, 200, 120); // 加椭圆 path.AddBezier(Point(220, 200), Point(250, 150),

Point(300, 50), Point(400, 200)); // 加贝塞尔曲线

int n = path.GetPointCount(); // 获取路径中的点数 Point *points = new Point[n]; // 新建点数组 path.GetPathPoints(points, n); // 获取路径中的点 //path.SetFillMode(FillModeWinding); // 设置填充模式 // 填充(开)路径

//graph.FillPath(&SolidBrush(Color::Aqua), &path); graph.DrawLines(&Pen(Color::Green), points, n); // 画折线 //path.CloseAllFigures(); // 关闭所有子路径 graph.DrawPath(&pen, &path); // 画路径轮廓

//graph.FillPath(&SolidBrush(Color::Red), &path); // 画填充路径 //DrawPoints(graph, Color::Red, 4, points, n); // 画路径中的点

4.添加图形

图形路径类GraphicsPath中的下列方法,用于添加图形到路径中(重载和参数都与

4

Graphics类中对应的绘图方法相同,但是前缀都从Draw改成了Add):

点列与路径

填充(开)路径

开(子)路径

闭(子)路径

图13-2 路径的构成

? 加直线:AddLine ? 加折线:AddLines ? 加多边形:AddPolygon ? 加矩形:AddRectangle ? 加矩形组:AddRectangles ? 加弧:AddArc ? 加饼:AddPie 5.绘制路径

? 加椭圆:AddEllipse ? 加贝塞尔曲线:AddBezier ? 加相连的多段贝塞尔曲线:

AddBeziers

? 加基样条曲线:AddCurve ? 加闭基样条曲线:AddClosedCurve ? 加串:AddString

可以用Graphics类的方法DrawPath来画路径的轮廓,用其另一个方法FillPath来填充路径的内部(对开路径,会先自动封闭,然后再进行填充):

Status DrawPath(const Pen *pen, const GraphicsPath *path); Status FillPath(const Brush *brush, const GraphicsPath *path);

当然你也可以用GraphicsPath类的方法SetFillMode和GetFillMode来设置不同的填充模式或者获取当前的填充模式:

5


GDI+高级编程 - 图文.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国铜管市场及投资调研报告目录

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: