GDI+高级编程.doc
《GDI+高级编程.doc》由会员分享,可在线阅读,更多相关《GDI+高级编程.doc(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-作者xxxx-日期xxxxGDI+高级编程【精品文档】第13章 GDI+高级编程*本章介绍GDI+的路径、区域、变换、图像处理和图元文件等高级编程内容。路径由许多不同类型的点所构成,用于表示复杂的不规则图形。区域是由矩形、椭圆、多边形等几何形状组合构成的一种封闭图形,可用于复杂图形的绘制、剪裁和击中测试等。Graphics类可对绘制的图形进行平移、旋转和伸缩变换。矩阵类Matrix则可用于图形、图像、颜色、路径、区域等对象的变换。GDI+的图像处理功能强大,可以加载、保存和操作多种格式的图像。GDI+的图元文件格式为EMF+,可用来保存和重放绘图记录,也能用于交互绘图的重绘操作。13.1 路
2、径路径(path)是一系列相互连接的直线和曲线,由许多不同类型的点所构成,用于表示复杂的不规则图形,也叫做图形路径(graphics path)。路径可被以画轮廓和填充的形式显示输出,也可以用于创建区域和路径渐变刷等。虽然在GDI中也有路径(本课件未讲),但是它只是作为DC的一种状态才能存在。独立的路径对象,则是GDI+新增加的。13.1.1 图形路径在GDI+中,路径由图形路径类GraphicsPath表示,它是GDI+基类GdiplusBase的直接派生类。1构造函数GraphicsPath类有三个构造函数:GraphicsPath(FillMode fillMode = FillMode
3、Alternate); / 构造一个空路径GraphicsPath(const Point *points, const BYTE *types, INT count, FillMode fillMode = FillModeAlternate); / 构造含指定整数型点数组的路径GraphicsPath(const PointF *points, const BYTE *types, INT count, FillMode fillMode = FillModeAlternate); / 构造含指定浮数型点数组的路径其中:l 填充模式参数fillMode在上一章的画填充多边形和曲线时已经讲过
4、,枚举类型FillMode除了可取这里的默认值FillModeAlternate(交替填充模式)之外,还有一个可取的值是FillModeWinding(环绕替填充模式)。l 点数组参数points,可以是整数类型的,也可以是浮点数类型的。l 点类型数组参数types,主要点类型有路径起点、直线端点和贝塞尔点。l 计数参数count为数组points和types的元素数,这两种数组中的元素数必须一致。2点的种类构造函数中,点的类型取值为枚举类型PathPointType常量;typedef enum PathPointTypeStart = 0, / 起点 PathPointTypeLine =
5、 1, / 直线端点 PathPointTypeBezier = 3, / 贝塞尔(曲线的控制)点 PathPointTypePathTypeMask = 0x7, / 点类型掩码(只保留低三位) PathPointTypePathDashMode = 0x10, / 未使用 PathPointTypePathMarker = 0x20, / 标记点(用于路径分段) PathPointTypeCloseSubpath = 0x80, / 闭子路径(图形)的终点 PathPointTypeBezier3 = 3 / 同PathPointTypeBezier PathPointType;其中,主要
6、的点类型有起点、直线端点、贝塞尔点、标记点和闭子路径终点。其他曲线类型(如弧、椭圆和基样条曲线等)在路径中都是用贝塞尔曲线来表示的。路径是由点组成的,但这里的点,不光指其坐标位置,还包括点的类型。同样的点坐标,不同的点类型,最后得到的路径可能大相径庭。例如,同一组点,定义两个路径,一个的点类型全是直线端点,另一个的起点之后有3个贝塞尔点,最后才是两个直线点(参见图13-1,其中自定义画点列函数/方法DrawPoints,在画曲线时用过,源码参见12.6.5的1):Point points = Point(40, 140), Point(275, 200), Point(105, 225), P
7、oint(190, 300), Point(50, 350), 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); / 创建复合路径G
8、raphics 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
9、.DrawLines(&Pen(Color:Magenta), points, 6);DrawPoints(graph, Color:Red, 4, points, 6);图13-1 点类型3路径的构成前面已经讲过,路径是一系列相互连接的直线和曲线,它们最终都是由有序点列所组成。可以利用GraphicsPath类的后两个构造函数,将点数组直接加入路径中。不过,路径中的直线和曲线等图形,一般是通过调用路径类的若干添加图形方法给加进去的。每个被加入的图形都可以是一个子路径(subpath)。路径对象,会将被加入图形(包括封闭图形)中的点尾首相接,连成一条完整的路径。在路径中的图形都是开图形(起点和
10、终点可能是同一个点,例如矩形、椭圆、多边形和闭曲线等),可以调用图形路径类的CloseFigure或CloseAllFigures方法:Status CloseFigure(VOID); / 关闭当前子路径Status CloseAllFigures(VOID); / 关闭所有子路径来显式闭合路径对象中的当前子路径或所有子路径。例如(参见图13-2):Graphics graph(pDC-m_hDC); / 创建图形像对象Pen pen(Color:Blue); / 定义蓝色笔GraphicsPath path; / 创建路径对象path.AddLine(, , , ); / 加水平直线/pa
11、th.StartFigure(); / 断开两条直线之间的连接(即分成两个子路径)path.AddLine(, , , ); / 加垂直直线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 Pointn; / 新建点数组path.GetPathPoints(point
12、s, 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); / 画填充路径/DrawP
13、oints(graph, Color:Red, 4, points, n); / 画路径中的点4添加图形图形路径类GraphicsPath中的下列方法,用于添加图形到路径中(重载和参数都与Graphics类中对应的绘图方法相同,但是前缀都从Draw改成了Add):点列与路径填充(开)路径开(子)路径闭(子)路径图13-2 路径的构成【精品文档】l 加直线:AddLinel 加折线:AddLinesl 加多边形:AddPolygonl 加矩形:AddRectanglel 加矩形组:AddRectanglesl 加弧:AddArcl 加饼:AddPiel 加椭圆:AddEllipsel 加贝塞尔曲
14、线:AddBezierl 加相连的多段贝塞尔曲线:AddBeziersl 加基样条曲线:AddCurvel 加闭基样条曲线:AddClosedCurvel 加串:AddString5绘制路径可以用Graphics类的方法DrawPath来画路径的轮廓,用其另一个方法FillPath来填充路径的内部(对开路径,会先自动封闭,然后再进行填充):Status DrawPath(const Pen *pen, const GraphicsPath *path);Status FillPath(const Brush *brush, const GraphicsPath *path);当然你也可以用Gr
15、aphicsPath类的方法SetFillMode和GetFillMode来设置不同的填充模式或者获取当前的填充模式:Status SetFillMode(FillMode fillmode);FillMode GetFillMode(VOID);关于画路径轮廓和填充路径的例子,前面已经有了很多,这里就不再列举了。6获取点信息在创建路径并添加各种几何图形或字符串之后,我们可以调用如下一些GraphicsPath类的方法,来获取路径中点的信息。包括点的坐标信息和点的类型信息:INT GetPointCount(VOID); / 获取路径中的总点数Status GetPathPoints(Poin
16、t *points, INT count); / 获取路径中(指定数目的)整数点数组Status GetPathPoints(PointF *points, INT count); / 获取路径中(指定数目的)浮点数点数组Status GetPathTypes(BYTE *types, INT count); / 获取路径中(指定数目的)点类型数组例如:GraphicsPath path; / 添加若干图形到路径int n = path.GetPointCount();Point *points = new Pointn;path.GetPathPoints(points, n);graph.
17、DrawLines(&Pen(Color:Green), points, n);DrawPoints(graph, Color:Red, 4, points, n);13.1.2 路径渐变刷路径可以表示复杂的图形,可以用于绘制这些图形的轮廓和填充,也可以用于创建区域(在下一节介绍)和颜色渐变刷。后者在前面美术字部分的彩心字符串例中(参见12的5),我们已经用过。与其它具体刷(如实心刷、条纹刷和纹理刷等)类一样,路径渐变(梯度)刷类PathGradientBrush,也是Brush类的派生类。它有3个构造函数:PathGradientBrush(const GraphicsPath *path)
18、;PathGradientBrush(const Point *points, INT count, WrapMode wrapMode = WrapModeClamp);PathGradientBrush(const PointF *points, INT count, WrapMode wrapMode = WrapModeClamp);第一个构造函数从现有路径对象来创建画刷,后两个则是从整数或浮点数点集来直接创建画刷,而且它们两个还有一个指定重复排列的输入参数wrapMode,默认值为WrapModeClamp(不重复排列)。路径刷的颜色,一般是从路径点(周边轮廓)向路径中心渐变。路径刷
19、的默认中心为路径的形心,可以用路径刷方法SetCenterPoint来重新设置:Status SetCenterPoint(const Point &point);Status SetCenterPoint(const PointF &point);其中的中心点,可以位于任何位置,包括在路径的范围之外。对应的获取刷中心的方法是:Status GetCenterPoint(Point *point);Status GetCenterPoint(PointF *point);其它常用的路径刷方法有:Status SetCenterColor(const Color &color); / 设置刷中心
20、颜色Status SetSurroundColors(const Color *colors, INT *count); / 设置路径点颜色Status GetCenterColor(Color *color); / 获取刷中心颜色INT GetSurroundColorCount(VOID); / 获取路径点颜色数目Status GetSurroundColors(Color *colors, INT *count); / 获取路径点颜色数组其中,路径刷的中心色和路径点色,默认都为背景色(白色)。例如(用路径刷画五角星,参见图13-3): INT count = 10; Point poin
21、ts = Point(100, 0), Point(122, 69), Point(195, 69), Point(137, 111), Point(159, 181), Point(100, 138), Point(41, 181), Point(63, 111), Point(5, 69), Point(78, 69); GraphicsPath path; path.AddPolygon(points, count); Graphics graph(pDC-m_hDC); PathGradientBrush pgBrush(&path); pgBrush.SetCenterColor(C
22、olor:Red/*Green*/); graph.FillPath(&pgBrush, &path); Color cols = Color:Black, Color:Green, Color:Blue, Color:White, Color:Black, Color:Green, Color:Blue, Color:White, Color:Black, Color:Green; /*Color cols = Color:Cyan, Color:Aqua, Color:Blue, Color:Chartreuse, Color:Coral, Color:CadetBlue, Color:H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GDI 高级 编程
限制150内