ImageVerifierCode 换一换
格式:DOCX , 页数:96 ,大小:3.78MB ,
资源ID:11495073      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11495073.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(windows编程技术15GDI+高级编程.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

windows编程技术15GDI+高级编程.docx

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

2、)是一系列相互连接的直线和曲线,由许多不同类型的点所构成,用于表示复杂的不规则图形,也叫做图形路径(graphics path)。路径可以被画轮廓和填充,也可以用于创建区域和路径渐变刷等。在GDI中也有路径(本书未讲),但是它只是作为DC的一种状态才能存在。独立的路径对象,则是GDI+的新特点。15.1.1 图形路径在GDI+中,路径由图形路径类GraphicsPath表示,它是GDI+基类GdiplusBase的直接派生类。1构造函数GraphicsPath类有三个构造函数:GraphicsPath(FillMode fillMode = FillModeAlternate); / 构造一个

3、空路径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除了可取这里

4、的默认值FillModeAlternate(交替填充模式)之外,还有一个可取的值是FillModeWinding(环绕替填充模式)。 点数组参数points,可以是整数类型的,也可以是浮点数类型的。 点类型数组参数types,主要点类型有路径起点、直线端点和贝塞尔点。 计数参数count为数组points和types的元素数,这两种数组中的元素数必须一致。2点的种类构造函数中,点的类型取值为枚举类型PathPointType常量;typedef enum PathPointTypeStart = 0, / 起点 PathPointTypeLine = 1, / 直线端点 PathPointTy

5、peBezier = 3, / 贝塞尔(曲线的控制)点 PathPointTypePathTypeMask = 0x7, / 点类型掩码(只保留低三位) PathPointTypePathDashMode = 0x10, / 未使用 PathPointTypePathMarker = 0x20, / 标记点(用于路径分段) PathPointTypeCloseSubpath = 0x80, / 闭子路径(图形)的终点 PathPointTypeBezier3 = 3 / 同PathPointTypeBezier PathPointType;其中,主要的点类型有起点、直线端点、贝塞尔点、标记点和

6、闭子路径终点。其他曲线类型(如弧、椭圆和基样条曲线等)在路径中都是用贝塞尔曲线来表示的。路径是由点组成的,但这里的点,不光指其坐标位置,还包括点的类型。同样的点坐标,不同的点类型,最后得到的路径可能大相径庭。例如,同一组点,定义两个路径,一个的点类型全是直线端点,另一个的起点之后有3个贝塞尔点,最后才是两个直线点(参见图15-1,其中自定义画点列方法DrawPoints,在画曲线时用过,源码参见14.6.5的1): Point points = Point(40, 140), Point(275, 200), Point(105, 225), Point(190, 300), Point(50

7、, 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); / 创建复合路径 Graphics graph(pDC-

8、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

9、(&Pen(Color:Magenta), points, 6); DrawPoints(graph, Color:Red, 4, points, 6);图15-1 点类型3路径的构成前面已经讲过,路径是一系列相互连接的直线和曲线,它们最终都是由有序点列所组成。可以利用GraphicsPath类的后两个构造函数,将点数组直接加入路径中。不过,路径中的直线和曲线等图形,一般是通过调用路径类的若干添加图形方法给加进来的。每个被加入的图形都可以是一个子路径(subpath)。路径对象,会将被加入图形(包括封闭图形)中的点尾首相接,连成一条完整的路径。在路径中的图形都是开图形(起点和终点可能是同一个点

10、,例如矩形、椭圆、多边形和闭曲线等),可以调用图形路径类的CloseFigure或CloseAllFigures方法:Status CloseFigure(VOID); / 关闭当前子路径Status CloseAllFigures(VOID); / 关闭所有子路径来显式闭合路径对象中的当前子路径或所有子路径。例如(参见图15-2): Graphics graph(pDC-m_hDC); / 创建图形像对象 Pen pen(Color:Blue); / 定义蓝色笔 GraphicsPath path; / 创建路径对象 path.AddLine(10.0f, 50.0f, 200.0f, 50

11、.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 = n

12、ew Pointn; / 新建点数组 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); / 画路径轮廓 DrawPoints(

13、graph, Color:Red, 4, points, n); / 画路径中的点4添加图形图形路径类GraphicsPath中的下列方法,用于添加图形到路径中(重载和参数都与Graphics类中对应的绘图方法相同,但是前缀都改成了Add): 点列与路径 填充(开)路径 开(子)路径 闭(子)路径图15-2 路径的构成 加直线:AddLine 加折线:AddLines 加多边形:AddPolygon 加矩形:AddRectangle 加矩形组:AddRectangles 加弧:AddArc 加饼:AddPie 加椭圆:AddEllipse 加贝塞尔曲线:AddBezier 加相连的多段贝塞尔曲

14、线:AddBeziers 加基样条曲线:AddCurve 加闭基样条曲线:AddClosedCurve 加串:AddString5绘制路径可以用Graphics类的方法DrawPath来画路径的轮廓,用其另一个方法FillPath来填充路径的内部(对开路径,会先自动封闭,然后再进行填充):Status DrawPath(const Pen *pen, const GraphicsPath *path);Status FillPath(const Brush *brush, const GraphicsPath *path);当然你也可以用GraphicsPath类的方法SetFillMode和

15、GetFillMode来设置不同的填充模式或者获取当前的填充模式:Status SetFillMode(FillMode fillmode);FillMode GetFillMode(VOID);关于画路径轮廓和填充路径的例子,前面已经有了很多,这里就不再列举了。6获取点信息在创建路径并添加各种几何图形或字符串之后,我们可以调用如下一些GraphicsPath类的方法,来获取路径中的点的信息。包括点的坐标信息和点的类型信息:INT GetPointCount(VOID); / 获取路径中的总点数Status GetPathPoints(Point *points, INT count); /

16、获取路径中(指定数目的)整数点数组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.DrawLines(&Pen(Color

17、:Green), points, n); DrawPoints(graph, Color:Red, 4, points, n);15.1.2 路径渐变刷路径可以表示复杂的图形,可以用于绘制这些图形的轮廓和填充,也可以用于创建区域(在下一节介绍)和颜色渐变刷。后者在前面美术字部分的彩心字符串例中(参见14.8.3 5),我们已经用过。与其它具体刷(如实心刷、条纹刷和纹理刷等)类一样,路径渐变(梯度)刷类PathGradientBrush,也是Brush类的派生类。它有3个构造函数:PathGradientBrush(const GraphicsPath *path);PathGradientBr

18、ush(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); / 设置刷中心颜色Status SetSurro

20、undColors(const Color *colors, INT *count); / 设置路径点颜色Status GetCenterColor(Color *color); / 获取刷中心颜色INT GetSurroundColorCount(VOID); / 获取路径点颜色数目Status GetSurroundColors(Color *colors, INT *count); / 获取路径点颜色数组其中,路径刷的中心色和路径点色,默认都为背景色(白色)。例如(用路径刷画五角星,参见图15-3): INT count = 10; Point points = Point(100, 0

21、), 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(Color:Red/*Green*/

22、); 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:HotPink, Color:Tur

23、quoise, Color:LightSkyBlue, Color:DeepPink; pgBrush.SetCenterColor(Color:White);*/ pgBrush.SetSurroundColors(cols, &count); graph.TranslateTransform(200.0f, 0); graph.FillPath(&pgBrush, &path); for (int i = 0; i count; i+) colsi = Color(rand() % 255, rand() % 255, rand() % 255); pgBrush.SetSurroundC

24、olors(cols, &count); pgBrush.SetCenterColor(Color(rand() % 255, rand() % 255, rand() % 255); graph.TranslateTransform(-200.0f, 200.0f); graph.FillPath(&pgBrush, &path); for (int i = 0; i count; i+) colsi = Color(rand() % 255, rand() % 255, rand() % 255); pgBrush.SetSurroundColors(cols, &count); pgBr

25、ush.SetCenterColor(Color(rand() % 255, rand() % 255, rand() % 255); graph.TranslateTransform(200.0f, 0.0f); graph.FillPath(&pgBrush, &path);输出结果为(由于下排的两个五角星,使用的是随机色,所以每次刷新时,颜色都不一样) a) b)图15-3 路径刷五角星a)上排左为红心和白边点,上排右为红心和和黑、绿、蓝、白边点b) 上排的左右皆为绿心,边点色同a)的a)和b)下排的中心点和边点都为随机色,刷新后颜色会变如果将边点全改成红色、绿色或蓝色,中心改为白色,则

26、输出效果如图15-4所示。图15-4 路径刷五角星(白心,红、绿、蓝边)又例如(用路径刷画平铺六边形,参见图15-5和图15-6):#include void FillHexagon(HDC hdc, RectF &rect) / 用路径刷画平铺六边形 float radian = 3.1415926f / 180.0f; float l = 50.0f, fh = l * sin(60.0f * radian); PointF pts = PointF(50.0f, 0.0f), PointF(50.0f * 1.5f, 0.0f), PointF(50.0f, 0.0f), PointF(

27、50.0f / 2.0f, -fh), PointF(-50.0f / 2.0f, -fh), PointF(-50.0f, 0.0f), PointF(-50.0f * 1.5f, 0.0f), PointF(-50.0f, 0.0f), PointF(-50.0f / 2.0f, fh), PointF(50.0f / 2.0f, fh); PathGradientBrush pgBrush(pts, 10); pgBrush.SetWrapMode(WrapModeTile); Graphics graph(hdc);图15-5 六边形坐标 pgBrush.SetCenterColor(

28、Color:Red); graph.FillRectangle(&pgBrush, rect); graph.TranslateTransform(75.0f, fh); pgBrush.SetCenterColor(Color:Green); graph.FillRectangle(&pgBrush, -75.0f, -fh, rect.Width, rect.Height);void CGdipDrawView:OnDraw(CDC* pDC) RECT srect; GetClientRect(&srect); RectF rect(0.0f, 0.0f, REAL(srect.righ

29、t), REAL(srect.bottom); FillHexagon(pDC-m_hDC, rect); / 用路径刷画平铺六边形图15-6 路径刷平铺六边形15.2 区域区域(region)由若干几何形状所构成的一种封闭图形,主要用于复杂图形的绘制、图形输出的剪裁和鼠标击中的测试等。最简单也是最常用的区域是矩形,其次是椭圆和多边形以及它们的组合。这些也正是GDI所支持的区域类型。GDI+中的区域是一种显示表面的范围(an area of the display surface),可以是任意形状(的图形的组合),边界一般为路径。除了上面所讲的矩形、椭圆、多边形之外,其边界还可以含直线、折线、

30、弧、贝塞尔曲线和基样条曲线等开图形,其内容还可以包含饼、闭贝塞尔曲线和基样条曲线等闭图形。在GDI+中,区域所对应的类是Region,它是一个独立的类(没有基类,也没有派生类)。但是它有若干相关的类,如各种图形类和图形路径类等。15.2.1 构造函数Region类有6个构造函数:Region(VOID); / 创建一个空区域Region(const Rect &rect); / 创建一个整数型矩形区域Region(const RectF &rect); / 创建一个浮点数型矩形区域Region(const GraphicsPath *path); / 由图形路径来创建区域Region(const BYTE *regionData, INT size); / 由(另一)区域的数据构造区域Region(HRGN hRgn); / 由GDI的区域句柄构造区域其中,创建矩形区域最简单,由路径创建区域最常用。15.2.2 其他方法区域类的其他方法有:Region *Clone(VOID); / 克隆(复制)/ 判断本区域是否与另一区域region相等,g用于坐标计算:BOOL Equals(const R

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1