GDI 高级编程

发布 2020-01-02 15:59:28 阅读 2326

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

路径由许多不同类型的点所构成,用于表示复杂的不规则图形。区域是由矩形、椭圆、多边形等几何形状组合构成的一种封闭图形,可用于复杂图形的绘制、剪裁和击中测试等。graphics类可对绘制的图形进行平移、旋转和伸缩变换。

矩阵类matrix则可用于图形、图像、颜色、路径、区域等对象的变换。gdi+的图像处理功能强大,可以加载、保存和操作多种格式的图像。gdi+的图元文件格式为emf+,可用来保存和重放绘图记录,也能用于交互绘图的重绘操作。

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

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

在gdi+中,路径由图形路径类graphicspath表示,它是gdi+基类gdiplusbase的直接派生类。

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); 构造含指定浮数型点数组的路径。

其中: 填充模式参数fillmode在上一章的画填充多边形和曲线时已经讲过,枚举类型fillmode除了可取这里的默认值fillmodealternate(交替填充模式)之外,还有一个可取的值是fillmodewinding(环绕替填充模式)。

点数组参数points,可以是整数类型的,也可以是浮点数类型的。

点类型数组参数types,主要点类型有路径起点、直线端点和贝塞尔点。

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

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

typedef enum ; 定义点数组。

// 定义点类型数组(为了节省篇幅,有些直接用了枚举的整数值)

byte linetypes

byte types

graphicspath path1(points, linetypes, 6), 创建直线路径。

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

graphics graph(pdc->m_hdc); 创建图形对象。

// 填充直线路径、画直线、画点列。

&path1);

points, 6);

drawpoints(graph, color::red, 4, points, 6);

0); 右移300像素。

// 填充复合路径、画直线、画点列。

&path2);

points, 6);

drawpoints(graph, color::red, 4, points, 6);

图13-1 点类型。

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

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

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

status closefigure(void); 关闭当前子路径。

status closeallfigures(void); 关闭所有子路径。

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

例如(参见图13-2):

graphics graph(pdc->m_hdc); 创建图形像对象。

pen pen(color::blue); 定义蓝色笔。

graphicspath path; /创建路径对象。

50.0f, 200.0f, 50.0f); 加水平直线。

// 断开两条直线之间的连接(即分成两个子路径)

10.0f, 60.0f, 80.0f); 加垂直直线。

100, 200, 120); 加椭圆。

200), point(250, 150),

point(300, 50), point(400, 200));加贝塞尔曲线。

int n = 获取路径中的点数。

point *points = new point[n]; 新建点数组。

n); 获取路径中的点。

// 设置填充模式。

// 填充(开)路径。

&path);

points, n); 画折线。

// 关闭所有子路径。

&path); 画路径轮廓。

&path); 画填充路径。

//drawpoints(graph, color::red, 4, points, n); 画路径中的点。

图形路径类graphicspath中的下列方法,用于添加图形到路径中(重载和参数都与graphics类中对应的绘图方法相同,但是前缀都从draw改成了add):

点列与路径填充(开)路径。

开(子)路径闭(子)路径。

图13-2 路径的构成。

C 高级编程

第六章熟悉类与对象。6.1 电子 示例介绍。6.2 编写类。6.2.1 类定义。1.方法与成员。2.访问控制。3.声明的顺序。6.2.2 定义方法。1.访问数据成员。2.调用其他方法。指针。6.2.3 使用对象。1.堆栈中的对象。2.堆中的对象 6.3 对象的生命周期。6.3.1 创建对象。1.编写...

数控高级编程讲义

第一篇铣工篇 1 专题一行切和环切 1 1.1环切 1 1.1.1环切刀具半径补偿值的计算 1 1.1.2环切刀补程序工步起点 下刀点 的确定 1 1.1.3在程序中修改刀具半径补偿值 2 1.1.4 环切宏程序 4 1.2 行切 5 1.2.1 矩形区域的行切计算 5 1.2.2行切的子程序实现 ...

数控高级编程教案

数。控。高。级。编。程。教。案。第一篇铣工篇 1 专题一行切和环切 1 1.1环切 1 1.1.1环切刀具半径补偿值的计算 1 1.1.2环切刀补程序工步起点 下刀点 的确定 2 1.1.3在程序中修改刀具半径补偿值 2 1.1.4 环切宏程序 4 1.2 行切 5 1.2.1 矩形区域的行切计算 ...