GDI+ 和GDI
GDI:Graphics Device Interface,即图形设备接口,是Windows API的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:
(1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动程序的调用。
为实现图形设备无关性,Windows的绘图操作在一个设备描述表上进行。用户拥有自己的“逻辑坐标”系统,它独立于实际的物理设备,与“设备坐标”相对应。开发Windows应用程序时,程序员关心的是逻辑坐标,我们在逻辑坐标系上绘图,利用GDI将逻辑窗口映射到物理设备上。
(2)GDI能检测具体设备的能力,并依据具体的设备以最优方式驱动这些设备,完成真实的显示。
GDI函数大致可分类为:

GDI虽然使程序员得到了一定程度的解脱,但是其编程方式仍很麻烦。譬如,显示一张位图,程序员需要进行“装入位图 | 读取位图文件头信息 | 启用设备场景 | 调色板变换”等一连串操作。而有了GDI+,这些问题便迎刃而解了。
GDI+:GDI+是GDI的后续版本,最早于2001年随WinXP一起推出,后来又被包装进.NET框架的托管类库中,成为.NET中窗体绘图的主要工具。

GDI+主要提供了以下三类服务:
(1)二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;
(2)图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类。它们可用于显示、操作和保存BMP、JPG、GIF等图像。
(3)文字显示:GDI+支持使用各种字体、字号和样式来显示文本。
GDI接口是基于函数的,而GDI+是基于C++ OO的编程接口,因此使用起来比GDI要方便。因为GDI+实际上是GDI的封装和扩展,所以执行效率一般要低于GDI。
使用GDI时,经常需要将PEN、BRUSH等GDI对象选入DC,并需要保存旧的GDI对象,然后进行一些绘图操作。此时调用的绘图函数都是使用这些新选入的PEN、BRUSH,绘图完成之后再把旧的GDI对象重新选回DC,这称之为“状态模式”。而GDI+不是这样,GDI+只是将PEN、BRUSH等对象作为参数传递给绘图函数,它们只影响这一次的绘制,下次再调用绘图函数,可以将新的PEN、BRUSH传入给绘图函数,这称为“无状态模式”。与GDI相比,GDI+的编程模式发生了改变。
1、DC与Graphics
DC是GDI的核心,Graphics对象是GDI+的核心。DC和Graphics对象的作用相似,但使用句柄的编程模式和使用Graphics对象的面向对象的编程模型之间,存在一些基本的差异。
Graphics对象(像DC一样)与屏幕上的特定窗口关联,并具有指定如何绘制项目的属性(如 SmoothingMode 和 TextRenderingHint)。但Graphics 对象不受笔、刷、路径、图像或字体的约束,这与DC不同。例如,使用DC画线之前,必须先调用SelectObject以使笔对象和DC关联,即将笔选入DC中。之后的画线操作均使用该笔,直到选择另一支不同的笔为止。在GDI+中,将Pen对象作为参数传递给Graphics类的DrawLine方法。可以在一系列的 DrawLine 调用中,使用不同的Pen对象,而不必将给定的Pen对象与Graphics对象关联。
2、以画线为例
无论是GDI还是GDI+,都有API和MFC封装类两种使用方式。下面每个示例都从点(20, 10)到点(200, 100)绘制一条宽为3 的红色线条。
(1)GDI API

(2)GDI MFC

(3)GDI+ API

(4)GDI+ MFC

3、方法重载
许多GDI+方法都是重载的,这与MFC封装后的GDI类似。例如,DrawLine的重载方法有:

4、绘制和填充
GDI有一个Rectangle函数,可一步完成绘制轮廓和填充矩形内部。轮廓由当前选定的笔绘制,而内部则由当前选定的刷来填充。 GDI+使用Graphics类的DrawRectangle方法将 Pen对象作为参数绘制轮廓,使用Graphics类FillRectangle方法将Brush对象作为参数填充内部。
5、构造区域
GDI提供几种用于创建区域的函数(在MFC中,被封装在CRng类里):CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn 和CreatePolyPolygonRgn。你或许希望GDI+中的Region类也有类似的构造函数,将矩形、椭圆、圆角矩形和多边形作为参数接收,但事实并非如此。GDI+中的Region类提供一个接收Rectangle 对象的构造函数和另一个接收GraphicsPath对象的构造函数。如果想基于椭圆、圆角矩形或多边形构造区域,可以通过创建一个GraphicsPath对象(可包含椭圆的对象等),然后将其传递至Region构造函数来轻松实现。
路径(path)是一系列相互连接的直线和曲线,由许多不同类型的点所构成,用于表示复杂的不规则图形,也叫做图形路径(graphics path)。路径可以被画轮廓和填充,也可以用于创建区域和路径渐变刷等。在 GDI+中,路径由图形路径类GraphicsPath表示,它也是图形基类GraphicsBase 的派生类。关于GraphicsPath,以后再学习。
GDI+ 和GDI的更多相关文章
- Win32中GDI+应用(五)--GDI与GDI+编程模型的区别
在GDI里面,你要想开始自己的绘图工作,必须先获取一个device context handle,然后把这个handle作为绘图复方法的一个参数,才能完成任务.同时,device context ha ...
- GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用
在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitm ...
- GDI与GDI+性能比较
编写程序对GDI和GDI+绘制进行了比较,经过比较,GDI相对GDI+还是有一些性能优势的. 同时比较了每次绘制创建TGPGraphics对象和共用一个TGPGraphics对象的情况,两者性能相差不 ...
- GDI与GDI+ 贴图性能对比
在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...
- VC++中GDI和GDI+ 的坐标系统介绍
在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统.Windows提供了几种映射方式,每一种映射都对应着一种坐标系.例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两 ...
- gdi和gdi+比较
http://www.360doc.com/content/10/1013/17/1066008_60709410.shtmlhttp://www.360doc.com/content/10/1013 ...
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- MFC GDI绘图基础
一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...
随机推荐
- QTreeView
隐藏左侧的小箭头
- Linux 限制用户远程SSH登录
通过/etc/hosts.allow和/etc/hosts.deny两个配置文件远程限制某个IP和某段IP地址允许或拒绝访问Linux服务器 SSH.FTP.telnet等服务,其中/etc/host ...
- /文件和目录权限chmod /更改所有者和所属组chown/umask/隐藏权限lsattr/chattr
2.14 文件和目录权限chmod 2.15 更改所有者和所属组chown2.16 umask2.17 隐藏权限lsattr/chattr 文件和目录权限chmod 文件权限: r 4 ...
- 用外部物理路由器时与外部dhcp服务时怎样使用metadata服务(by quqi99)
作者:张华 发表于:2015-12-31版权声明:能够随意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 用外部 ...
- 64位系统web项目导出excel问题分析及解决方法汇总
最近在web项目中做了一个导出Excel功能.在导出的时候报错:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败. 一 ...
- EJB里的问题解答
1.什么是EJB? EJB即Enterprise JavaBean是JavaEE应用的业务层技术标准,以这项技术开发的组件叫做EJB组件. EJB架构师一个用于开发和部署基于组件的分布式业务应用的组件 ...
- 内存管理 初始化(八) 至kswapd_init
至此,内存初始化部分已看完,遗留问题: 1.对于unicore或者mips的页表建立都很清楚,但是对于ARM我不清楚: 初始化部分涉及的页表映射建立,我都以unicore架构为准,ARM的页表映射从原 ...
- sar监控工具详解
转自http://www.cnblogs.com/Amaranthus/p/3745680.html SAR NAME: SAR报告,收集,保存系统活动信息 语法: sar [ -A ] [ -b ...
- 【Linux】理解分区
http://blog.csdn.net/aaronychen/article/details/2270048 主分区逻辑分区设置 http://forum.ubuntu.org.cn/viewtop ...
- ABBYY FineReader 12没你想得那么简单
你是否觉得自己对ABBYY FineReader 12已经了如指掌了?也许你会认为它不过就是一款OCR文字识别软件,能够快速方便地将扫描纸质文档.PDF文件或者数码相机的图像转换为可编辑.可搜索的格式 ...