松鼠的博客

导航

GDI+介绍和进手

gdi+相比gdi绝对是个大的进步,显示各种图形文件如gif,jpg,没问题,简单方便。当然,这只是一个小的方面。因为交大vc课的作业主要是gdi,所以介绍一种更先进的方式大家也都会有益处。
前半部分译自msdn,没有“信”,倒是信口开河,写的很乱,只是想给大家开个头,好好讨论一下。

gdi+
目的
gdi+是微软为c/c++程序员提供的以类为基础的API。它使应用程序可以在显示器或打印机上使用图像或者格式化文本。基于win32 api的应用程序不直接与硬件交互,gdi+代表应用程序同硬件的驱动程序交互。gdi+也被win64支持。
适用场合
gdi+可以用在所有基于windows的应用程序中。gdi+是在windows xp和windows.net server中才包含的一项新技术,所以,在这之前的操作系统上部署需要先安装相应软件包。
gdi+概述
gdi+是xp和2003 server中的一个子系统,负责显示信息在屏幕和打印机上。它是通过一系列c++类向外界提供接口的api。
正如名字所示,gdi+是gdi的接任者,老系统使用gdi,但新系统应该使用gdi+,因为gdi+优化了gdi的很多功能并且提供了额外的特色。
gdi+提供了和具体设备无关的方法。
gdi+的三个部分:
2-D vector graphics(这个概念太迷人了,向量图形,原来图形是这样的)
Imaging(二维向量图形之外的图形图像,一般为图标,button图,存于内存中)
Typography(字体相关)

以类为基础的接口结构:
c++接口大约有40个类,50个枚举,6个结构体,还有少量独立的函数。Graphics类是gdi+接口的核心,它就是实际划直线、曲线、图形、图像和文字的类。
很多类和Graphics类协作工作。
(zz)GDI+新增功能
  (1)渐变的画刷(Gradient Brushes)
  GDI+允许用户创建一个沿路径或直线渐变的画刷,来填充外形(shapes),路径(paths),区域(regions),渐变画刷同样也可以画直线、曲线、路径,当你用一个线形画刷填充一个外形(shapes)时,颜色就能够沿外形逐渐变化。
2)基数样条函数(Cardinal Splines)
  GDI+支持基数样条函数,而GDI不支持。基数样条是一组单个曲线按照一定的顺序连接而成的一条较大曲线。样条由一系列点指定,并通过每一个指定的点。由于基数样条平滑地穿过组中的每一个点(不出现尖角),因而它比用直线连接创建的路径更精确。下面是分别使用两种方法创建的图形,一个使用基数样条,一个使用直线。
(3)持久路径对象(Persistent Path Objects)
在GDI中,路径属于设备描述表(DC),画完后路径就会被破坏。在GDI+中,绘图工作由Graphics对象来完成,你可以创建几个与Graphics分开的路径对象,绘图操作时路径对象不被破环,这样你就可以多次使用同一个路径对象画路径了。
  (4)变形和矩阵对象(Transformations & Matrix Object)
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩阵对象总是和一个图形变换对相联系起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接受矩阵对象的地址,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照先缩放后旋转完成。
(5)可伸缩区域(Scalable Regions)
  GDI+ 在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions 唯一可进行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换(譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
(6)Alpha Blending(混合)
  你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜色与背景色相互融合,填充色越透明,背景色显示越清晰,下图所示的四个椭圆被填充了同样的颜色,但由于拥有不同的透明度而呈现不同的显示效果。
(7)多种图像格式支持.
  图像在图形界面程序中占有举足轻重的地位,GDI+除了支持BMP等GDI支持的图形格式外,还支持JPEG(Joint Photographic Experts Group)、GIF(Graphics Interchange Format)、PNG(Exchangeable Image File)、TIFF(Tag Image File Format)等图像格式,你可以直接在程序中使用这些图片文件,而无需考虑它们所用压缩算法。
  (8)其它。
  GDI+还将支持其它技术,譬如重新着色、颜色校正、元数据、图形容器,也许这些功能我们会在将来的WindowsXP或者Microsoft VisualStudio。Net中看到.


3.编程模式的改变 Device Contexts(设备描述表), Handles(句柄), 和 Graphics Objects(图形对象)
  如果你曾经使用过GDI编写过应用程序,你肯定对设备描述表(DC)的概念非常熟悉,设备描述表是Windows使用的一个数据结构,用于存储具体设备能力和与如何在设备上重绘一些项目的有关属性信息。而且视频设备的设备描述表还与特定的窗口有关。首先你必须获得一个设备描述表句柄,然后在图形绘制时,你把这个句柄作为一个参数传递给GDI图形绘制函数。当然你也可以把它传递给获得或设置设备描述表有关属性的函数。
  利用GDI+函数,你不必使用句柄或者设备描述表。相反,你可以简单地创建一个图形对象(Graphics),然后以你熟悉的面向对象的编程方式调用它的方法即可,譬如myGraphicsObject.DrawLine(parameters)。Graphics对象是GDI+的核心,正如设备描述表是GDI的核心一样,设备描述表(DC)和图形对象(Graphics)在不同的环境下扮演着同样的角色,发挥着类似的作用,但是两者也存在着这质的不同。前者使用基于句柄的编程方法而后者使用面向对象的编程方法。
  图形对象和设备对象一样,与屏幕的显示窗口有关,它包含着与项目重绘有关的属性信息(譬如平滑度),然而图形对象并没有像GDI那样与Pen(画笔)、Path(路径)、Image(图像)、Font(字体)等搅在一起。在GDI中,所有与绘图有关的绘图对象必须选入指定设备描述表中(使用SelectObject函数),才能被指定的设备描述表所使用。而在GDI+中,你只需把这些绘图对象作为一个参数传递给图形对象Graphics方法调用即可,每一个图形对象所使用的绘图工具至于它调用方法使用的参数有关,它可以通过参数使用多种Pen和Brush绘图,而不是与特定的笔和画刷联系在一起。



下面的内容不是来自msdn。
如何在程序中应用gdi+
需要作一点点前提工作先。
1)包含相应的lib文件 gdiplus.lib
不会的就在stdafx.h里加入下列语句:#pragma comment(lib,"gdiplus.lib")
2)记住,使用gdi+要有开始和结束的函数,好多东东都是这样的,像com,各种连接等等。
先增加应用类成员变量ULONG_PTR m_t;
开始:
GdiPlus::GdiplusStartupInput g;
GdiPlus::GdiplusStartup(&m_t,&g,NULL);

结束:GdiPlus::GdiplusShutdown(m_t);


加的位置就不用说了吧,程序(或)开始和结束。

现在你就可以编写gdi+程序了,
还是在OnDraw()或者OnPaint里,
using namespace Gdiplus;
Graphics graphics(pDC->m_hDC);
Pen newPen(Color(233,3,3),3);
graphics.DrawRectangle(&newPen,50,50,100,60);


下面我的建议就是去看msdn并且编一个gdi+的hello world。

posted on 2008-06-27 21:43  Xproer-松鼠  阅读(537)  评论(0)    收藏  举报