王朝网络
分享
 
 
 

深入GDI(图形设备接口)编程

王朝delphi·作者佚名  2006-01-09
宽屏版  字体: |||超大  

GDI+是Windows 2000及以后版本的一个子系统,同原有的GDI(图形设备接口)一样,主要负责对显示器和打印机进行管理。GDI+为我们提供了在编程时使用的应用程序接口API(Application Programming Interface),通过这些API函数,GDI+让程序员在设计程序中不必考虑具体的显示器或打印机,直接使用由GDI+提供的类的方法便可以调用显示器或打印机,真正做到与设备无关。

注:如果使用GDI+图形系统,图形和艺术字将具有更平滑的轮廓,以及可调整的用真实颜色调和的透明度级别。在调整图片大小时,图片的显示将会更加清晰。

功能及特色

正如其名称一样,GDI+是对原有的GDI在功能上的升级,GDI+为我们提供的功能主要有三类:矢量图形输出、光栅图形输出和文字排版等。

GDI+与传统的GDI相比,主要有以下六方面的新特色:渐变画刷、独立的路径对象(Path Objects)、矩阵对象(Matrix Object)、区域(Scalable Regions)、Alpha Blending和多格式图片支持。

设备环境和图形对象

熟悉GDI编程的朋友对设备环境DC(Device Context)应该不会陌生。DC的数据结构存储了显示器(或打印机)的性能、属性之类的详细信息,这些数据信息决定程序如何在显示器上进行输出。所有的输出都通过DC来实现,如果想在窗口中画一个矩形,首先得通过GetDC得到DC,然后让DC去执行具体操作。

使用GDI+后,就不必考虑句柄、设备环境等概念了。只要简单地创建一个图形对象(Graphics Object),然后直接调用该对象的方法(Methods)进行绘图即可。图形对象是GDI+的核心,它和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于对象模型的GDI+。

同DC一样,图形对象也是和具体的窗口或是屏幕结合在一起的。图形对象中也包括了许多具体属性,这些具体的属性值指明了进行绘图的方法。图形对象中没有在DC中所绑定的具体的画笔、画刷、路径等对象。在GDI中绘图,首先必须为DC中选入一个画笔对象(在DC中的画笔只有一支是可以使用的),这支“笔”一直会使用到下次新选定画笔为止。而在GDI+中,你只需要在图形对象中调用画直线时,将画笔作为画直线的一个参数就可以了,即在GDI+中,可以同时使用多个画笔进行不同的绘图操作。

参数化的对象

从OnDrawlineGdiplus()的代码可以看出,GDI+可以将画笔作为单独的对象进行管理。并且对画刷、路径、图片、字体等对象也实现了参数化。在GDI+的图形对象中,这些对象被作为参数来传递的。举例说明,在填充矩形区域时,使用红色画刷,要做的只是建立红色画刷,在调用FillRectangle函数时,将红色画刷作为函数的参数,这样就能完成填充过程。

摒弃当前位置的概念

从上面的示例代码OnDraLine可以看出,在GDI中画一条直线首先得将笔的“当前位置”移到直线的起点坐标上(MoveTo),然后才能进行画直线的操作。“当前位置”这个定义给编程带来了不少的麻烦。GDI+中解决了这个问题,摒弃了“当前位置”这个没有多大用处的概念。对于画直线,直接说明起止点的坐标就行了。

注:如果你习惯了原来的GDI编程,这点应该引起你的注意。

方法的重载

GDI+的图形对象中有许多的方法在调用时可有多种形式,如画直线的函数DrawLine就有以下的几种调用方法:

Status DrawLine(IN const Pen* pen, IN REAL x1, IN REAL y1, IN REAL x2, IN REAL y2);

Status DrawLine(IN const Pen* pen, IN const PointF&& pt1, IN const PointF&& pt2);

Status DrawLine(IN const Pen* pen, IN INT x1, IN INT y1, IN INT x2, IN INT y2);

Status DrawLine(IN const Pen* pen, IN const Point&& pt1, IN const Point&& pt2);

上面的四种调用方式的目的都一样,从起点到终点以pen画笔画一条直线。

注:方法的重载为多样化的编程提供了方便。

绘图和填充相互独立

在GDI中使用Rectangle绘制矩形时,GDI用当前画笔绘制轮廓、用当前的画刷将矩形内部自动填充,画矩形和填充一步完成。而GDI+则将绘制轮廓填充内部相分离,这样一来,GDI+绘制填充轮廓时就显得更灵活。

构造区域

区域是窗口内的一块多边形或椭圆形的区域。在GDI中,CreateRectRgn、Crea-

teEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等函数都是与构造各种区域有关的,在GDI+中,这一切变得相对简单。在GDI+中,我们可以将一个矩形对象(Rectangle Object)作为参数传递给区域类(Region Class)的构造函数,这个参数也可以是图形路径对象(GraphicsPath Object)的地址,这样一来,创建一个区域较GDI要简单的多。比如,你想要创造一个椭圆形的区域,首先建立一个包含椭圆的图形路径对象A,通过“Region Region1(&&A)”便可以做出椭圆形的区域对象Region1。对于复杂区域(由各种形状和路径合成的区域),GDI+采用了新的管理方式。区域类支持区域、路径合成、交集运算。

支持GDI+的SDK

最新的Platform SDK支持我们直接使用GDI+。Platform为GDI+提供的头文件及库文件中,有40个类、50个列举(Enumerations)及6个结构(Structures)。其中,最关键的是图形类(Graphics Class),通过该类能够进行画直线、曲线、图片及文字输出。在这些类中,每个类之间并不是完全独立的,它们通常互为参数。开始调用GDI+函数之前,使用GdiplusStartup对GDI+进行启动。函数调用完之后,应使用GdiplusShutdown函数进行终止操作。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有