在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → GDI+ 绘图,写得很详细

GDI+ 绘图,写得很详细

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:4.23M
  • 下载次数:41
  • 浏览次数:284
  • 发布时间:2020-08-24
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.pdf
  • 所需积分:2
 

实例介绍

【实例简介】
vc 绘图,GDI+绘图,比GDI多了很多优点,比如抗锯齿,透明色等等!
●使用笔绘制线条和形状 使用刷填充形状 ●使用图像、位图和图元文件 a混合线条和填充 ●字体和文本 构造并绘制曲线 ●用颜色渐变的梯度刷填充形状 构造并绘制轨迹 变换 ●图形谷器 ●区域 重新着色 读取元数据 等非常丰富强人的功能。 2.GDI+新增特性 1)渐变画刷 渐变画刷( gradicnt brush梯度刷)通过提供用于填充图形、路径和区域的线性渐变画笔 和路径渐变画笔,GDI+扩展了GDⅠ的功能。渐变画笔还可用于绘制直线、曲线和路径。线 性渐变画笔可用于使用颜色来填充图形,画笔在图形中移动时,颜色会逐渐改变。例如,假 定通过指定图形左边为蓝色、右边为绿色,创建了一个水平渐变画笔。当用水平渐变画笔填 充该图形时,随着画笔从图形的左边移至右边,颜色就会由蓝色遂渐变为绿色。用类似方法 定义的垂直渐变画笔填充的图形,颜色从上到下变化。图6-1显示了用水平渐变画笔填充的 椭圆和用斜式渐变画笔填充的区域。 图6-1水平和斜式渐变画笔 用路径渐变画笔填充图形时,可选择不同的方法米指定当从图形的一部分至另一部分移 动画笔时颜色的变化方式。一种选择是指定中心颜色和边缘颜色,在从图形中间向外边缘移 动画笔时,像素逐渐从一种颜色变化到另一种颜色。图6-2显示了用路径渐变画笔填充的路 径(该路径是用对贝塞尔样条创建的) 图6-2路径渐变画笔 2)基数样条函数 GDI+支持在GD中不支持的基数样条( cardinal spines)。基数样条是连串单独的曲 线,这些曲线连接起来形成一条较长的光滑曲线。样条由点的数组指定,并通过该数组中的 每一个点。基数样条平滑地(没有锐角)通过数组中的每一个点,因此,比通过连接直线创 建的路径更光滑精准。图6-3显示了两个路径:一个以基数样条的肜式创建;另一个通过连 接直线创建。 图6-3基数样条路径和折线路径 3)持久路径对象 在GDⅠ中,路径属于改备上下文,并且会在绘制时被毁坏。利用GDI+,绘图由 Graphics 对象执行,可以创建并维护几个与 Graphics对象分开的持久的路径对象( persistent path object) Graphics Path对象。绘图操作不会破坏 Graphics Path对象,因此可以多次使用同一个 GraphicsPath对象来绘制路径。 4)变换和矩阵对象 GDI提供了 Matrix(矩阵)对象,它是一种可以使(缩放、旋转和平移等)变换 ( transformation)简易灵活的强大工具。矩阵对象一般与变换对象联合使用。例如 GraphicsPath对象具有 Trans form方法,此方法接收 Matrix对象作为参数。单一的3×3矩 阵可有储一种变换或一个变換序列。图6-4显示了一个路径在执行两种变换前后的情况。 图6-4路径的变换 5)可伸缩区域 GiDI+通过对可伸缩区域( Scalable regions)的支持极大地扩展了GDL。在GDI中 区域被存储在设备坐标中,而且,可应用于区域的惟一变换是平移。而GDⅠ-在仝局坐标中 存储区域,并且允许区域发生任何可存储在变换矩阵屮的变换(如缩放和旋转)。图6-5显 示一个区域在执行三种变换(缩放、旋转和平移)前后的情况。 图6-5区域的三种变换(缩放、旋转和平移) 6)a混色 在图6-5中,可以在变换区域(用蓝色阴影画笔填充)中看到未变换区域(用红色填充) 这是由Gυ攴持的α混色( Alpha blending,透明混合)实现的。使用α混色,可以指定填 充颜色的透明度。透明色与背景色相混合 填充色越透明,透出的背景色就越多。图 6-6显示四个用相同颜色(红色)填充、但透明层次不同的椭圆 图6-6不同透明度 7)丰富的图像格式支持 GDH提供 Image、 Bitmap和 Metafile类,可以用不同的格式加载、保存和操作图像 GD+支持BMP、GIF、JPEG、EXIF、PNG、TIFF、ION、WMF、EMF共9种常见的图像 格式 8)GDI的不足 虽然,相对于GDⅠ来说,GDI+确实增加了许多澌特性,而且功能更强大,使用也更 方便。但是,这并不等于GDI就能够完全代替GDI 因为GDI+实际上GDI+是GD的封装和扩展,GDH的执行效率一般要低于GDI的 另外,GiD不支持图的位运算,那么就不能进行异或绘图等操作。而且在VC中,GD|+还 不攴持双缓存机制(如内存DC和显示DC),这将大大影响GDI在髙速图形、图像、动 画和视频等方面的应用。 3.编程模式的改变 GDH+的出现,也使基于GD的编程模式产牛了很人变化:GDI+用一个“无状态模式”, 取代了GDI中(需要先将各种匚具和项目选入DC对象后,才能进行绘图的)“状态模式”。 主要体现在以下几个方面 1)DC句柄和图形对象 设备上下文(DC= Device context)是GDI中使用的一种结构,用」存储与特定显示设 备的功能、以及指定如何在该设备上绘制项目之属性相关的信息。用于屏幕显示的DC还与 特定窗口相关联。为了使用GDⅠAP进行绘图,必须首先获得个DC的句柄(HDC= Handle to a do),然后将该句柄作为参数,传递给实际进行绘图的GDI函数。还可以将此句柄作 为参数,传递给获取和设置DC属性的GDI函数。 使用GDl,不需要再(直接)使用句枘或设备上下文,而是只需(通过HDC)创建 个 Graphics对象,然后用熟悉的面向对象方式来调用其中的各种绘图方法,例如 my Graphics Object DrawLine(&pen, xl, y1, x2, y2); 正如DC是GDI的核心, Graphics对象也位于GDH的核心。DC和 Graphics对象的作 用相似,但在使用设备上下文(GD)的基于句枘的编程模式和使用 Graphics对象(GDH) 的面向对象的编程模型之间,存在一些基本的差异。 〔 Graphics对象(像DC样)与屏幕上的特定窗∏关联,并具有指定如何绘制项目的属 性(如 Smoothingmode和 Text renderinghint)。但是, Graphics对象不受笔、刷、路径、图 像或字体的约朿,这与设备上下文不同。例如,使用设各上下文绘制线条之前,必须先调用 Seleclobject以使笔对象和DC关联,即将笔选入DC中。在设备上下文中绘制的所有线条 均使用该笔,直到选择另一支不同的笔为止。在GDI中,将Pen对象作为参数传递给 Graphics类的 Draw line方法。可以在系列的 Draw line调用的每个调用中,使用不同的 Pen对象,而不必将给定的Pen对象与 Graphics对象关联。 2)绘制线条的两种方法 下面每个示例都从点(20,10)到点(200,100绘制条宽为3的红色线条。第一个示例调 用GDI,第二个示例则通过托管类接口调用GDI+;它们都有分别使用API和MFC的两个 版本。 (1)用GDI画线 ●API 要使用GDI绘制线条,需要两个对象:设备上卜文和笔。在 WM PAINT的消息响应 代码中,通过调用 Begin Paint,可以获得设备卜:下文句柄;通过调用 CreatePen,则可以获 得笔句柄。再调用 Selectobject以将笔选入设备上下文。调用 MoveToEx,将笔的当前位置 设在(20,10),然后请用 Lineto,在笔的当前位置与位置(200,100)之间绘制一条线条。请注 意,所有这些函数和类型,都是全局的。而且 MoycToEx和 Lincto均将hdc(设备上下文 的句枘)作为参数接收 WM PAINT HDC hdc;∥DC句柄 PAINTSTRUCT pS;∥点结构 HPEN hPcn:∥/笔句柄 pEn hPenold;∥用于保存原笔的句柄 hdc- BeginPaint(hwnd,&ps);∥获得DC句柄,开始绘制,其中hwnd为窗口句 柄 hPen= CreatePen( PS SOLID,3,RGB(2550,0));∥创建红色画笔,宽3 hAnoLd= SclcctObjcct(hdc,hPen;∥/选笔入DC Move Toex(hdc,20,10,NULL);∥最后一个参数是返回用的旧当前点的结构指针 Lineto(hdc,200,100);∥画线 Sclcctobjcct(hd, hAnold;:∥选原笔入DC DeleteObject(hPen);∥朋除创建的笔 EndPaint(hWnd,&ps);∥绘制结束 break MFC 利用MFC进行GDI绘图,步骤与API的差不多,只是MFC将各种GD功能封装到了 不同的类中。例如,笔的类为CPen、点的类为 CPoint、设备上下文的类为CDC。而且所有 的绘图函数都被封在CDC类中,所以只能作为其对象的成员函数才能被使用,当然也就不 用再带HDC句柄作为输入参数了 void CGdipDemo View: OnDraw(CDC* pDC) CGdipDrawDoc* pDoc=GetDocumento; ASSERT VALID(pDoc) if(pDoc)return ∥TODO:在此处为本机数据添加绘制代码 CPen pen( PS SOLID,3,RGB(255,0,0);∥创建红色画笔,宽3 pDC> Selectobjec(&pen);∥选入DC ∥pDC> Sclcctobjcct(ncw CPcn( PS SOLID,3,RGB(255,0,0);∥上两步可以 合并 pDC-→ MoveTo(20,10);∥将当前点移到直线的起点 pDC> Lineto(200,100);∥画线 (2)用GDH+画线 ●API 使用GDH和托管类接口绘制线条,需要 Graphics对象和Pen对象。绘制线条涉及调用 Graphics类的 DrawLine方法。 DrawLine方法的第一个参数是Pen对象。与前面GDI示例中 显示的技术(将笔选入设备上下文)相比,这是一个更加简单而灵活的方案。 WM PAINT HDC hdc. PAINTSTRUCT pS Pen* Pen; Graphics *my Graphics hdc= Begin Paint(hWnd,&ps) myPen= new pen(0x0003);∥创建一个笔,宽3,红色 my Graphics=new( Graphics(hdc);∥利用DC句柄创建图形对象 my Graphics-> DrawLine( mypen,20,10,200,100);∥调用图形对象的画线厅法 EndPaint(h Wnd, &ps) break MFC 利用MFC进行GDH+绘图,步骤与API的差不多。只是代码改在 Ondraw函数中,而 且获取DC句柄的方法不同。 void CGdip demo view: OnDraw(CDC* pDC)i C Draw Doc- pDoc- GetDocumento: ASSERT VALID(PDOC); if(p doc)return; ∥TODO:在此处为本机数据添加绘制代码 Graphics my Graphics(pDC->mhDC);∥利用DC句柄创建图形对象 Pen my Pen( Color(25,0,0),3);∥创建一个笔,宽3,红色 my Graphics. DrawLine(& my Pen,20,10,200,100);∥调用图形对象的画线方法 ∥上两步也可以合并 // my Graphics. Draw Line(&Pen( Color(255, 0,0), 3), 20, 10, 200, 100) 3)作为参数的笔、刷、路径、图像和字体 前面的示例显示:创建和维护Pen对象可以与提供绘制方法的 Graphics对象分开。创 建和维护 Brush、 GraphicsPath、 Image和ront对象也可以与 Graphics对象分开, Graphics 类提供的许多绘制方法都将这些对象作为参数接收 例如,Bush对象作为参数传递至 FillRcctang方法,( iraphicPath对象作为参数传递至 Draw Path方法。同样, Image和Font对象传递至 Drawlmage和 Draw String方法。这与GDl 不同,在GD中,需要将笔、刷、路径、图像或字体选入DC,然后将DC的句柄作为参数 传递至绘制函数或采用CDC类对象的函数来绘图。 4)方法重载 许多GDH+方法都是重载的,即,若干方法共享同一名称,却有不同的参数列表。这 点与用MFC封装后的GDⅠ类似,但是GD中的重载方法要更多些。(注意,在NET、 C#、Java和VB中,都把类的成员函数称为方法。当我们在C++中,使用NET框架类厍中 的类和功能时,也常常将其成员函数改称为方法。)例如,画线的重载方法有: Status Draw Line(const Pen*pen, REaL xl, REaL yl, REAL X2, REAL y2) Status Draw Linc(const Pcn*pen, const PointF& pt1, const PointF& pt2) Status DrawLine(const Pen pen, INTXl, INTyl, INT X2, INT y2) Status Draw Line(const Pen*pen, const Point& ptl, const Point& pt2) 其中, typedef int INT; class point{ public:INTX;INTY;……}; typedef noat REAL; class PointF &public: REALX: REALY 5)无当前位置 前面所述的 Drawline方法中显示:线条的起点和终点均被作为参数接收。这与GDI方 案不同,在GDI中,调用 MoveToex(hdc,x1,y1,NULL)或pDC-> MoveTo(x1,yl)来设置当前 笔位置之后,再调用 Lineto(hc,x2,y2)或pDC→ Lineto(x2,y2)来绘制一条从(xl,yl)到 (x2,y2)的线条。GDI+从总伓上凵经放弃了当前位置的概念 6)绘制和填充的不同方法 论及绘制轮廓和填充图形内部吋,GDⅠ+要比GDⅠ更灵活。GDⅠ有个 Rectangle函数, 可一步完成绘制轮廓和填充矩形内部。轮廓由当前选定的笔制,而内部则由当前选定的刷 米填充。 GDI+使用个的方法来绘制轮廓和填充矩形内部。 Graphics类的 Draw Rectangle方法将 Pen对象作为其参数之一,而 Fillrectangle方法将 Brush对象作为其参数之一。 7)构造区域 GDI提供几种用于创建区域的函数(在MFC中,它们被封装在CRng类里): Createrect Rgn、 CrcatcEllpticRgn、( CrcatcRoundRcctrgn、 CrcatcPolygonRgn和 CrcatcPolyPolygonRgn 您或许希望GDI中的 Region类也有类似的构造函数,将矩形、椭圆、圆角矩形和多边形作 为参数接收,但事实并非如此。GDH+中的 Region类提供一个接收 Rectangle对象的构造函 数和另一个接收〔 GraphicsPath对象的构造函数。如果想基于椭圆、圆角矩形或多边形构造区 域,可以通过创建一个( raphics Path对象(可包含椭圆的对象等),然后将其传递全 Region 构造函数来轻松实现。 GDH+通过组合图形和路径,使得构成复杂区域十分简单。 Region类具有 Union和 Intersect方法,可用于扩展具有路径的现有区域或其它区域。GDI+方案一个很好的功能就是 GraphicsPath对象在作为参数传递至 Region构造函数时不会被破坏(在GD中,可以使用 PathToRegion函数将路径转换为区域,但在此过程中,路径将被破坏)。另外, Graphics Path 对象在作为参数传递给 Union或 Intersect方法时也不被破坏,因此,在一些单独的区域中, 可以将给定的路径作为构造块使用。例如 Region regionl(rectI) Regio gl 2(recta 2); regionl Union(onePath) ct(onePath) 4.GDⅠ+的使用 下面通过一个简单的例子,来说明如何使用GD+进行应用程序开发。 1)GDH开发包 若采用的是Ⅵ isual c+2005,则已经包含了开发GDIH应用程序所需的所有东西。包括 动态链接库文件 gdiplus.dl 静态链接库文件 gdiplus 代码屮所需要的头文件 gdiplus*h 帮助文档 gdicpp. chm和 gdicpp 如果你使用的操作系统是 Windows Xp或 Windows server2003,则GDIH所对应的动态 链接库,已经被包含在其中。 gdiplus dl一般位于操作系统的 WinSxs( Windows side-by-Side assembly,视窗并行程序集)日录中,例如 C: WINDOWS WinSXSx86 Microsoft Windows. GdiPlus 6595b64144ccfldf 1 0.0.0 x-ww 8d 353f13 gdiplus. dll(1661KB,2002.10.8 C: WINDOWS Win SxSx86 Microsoft windows GdiPlus 6595b64144ccfl df 1.0.2600.2180X ww52219f82 gdiplus. dll(1672KB,2004.84) 而GDI的动态链接库gdi32.d,却一般在架作系统的32位系统目永中 F: WINDOWSisystem32\ gdi32. dll(272KB, 2004.8.4) 【实例截图】
【核心代码】

标签:

实例下载地址

GDI+ 绘图,写得很详细

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警