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

511984783

511984783

2016-02-19 12:47

今天图老师小编要跟大家分享深入GDI(图形设备接口)编程,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!
    GDI+是Windows 2000及以后版本的一个子系统,同原有的GDI(图形设备接口)一样,主要负责对显示器和打印机进行管理。GDI+为我们提供了在编程时使用的应用程序接口API(Application Programming Interface),通过这些API函数,GDI+让程序员在设计程序中不必考虑具体的显示器或打印机,直接使用由GDI+提供的类的方法便可以调用显示器或打印机,真正做到与设备无关。 SCRIPT language=JavaScript1.1 src="深入GDI(图形设备接口)编程_高级编程_网上学园_科技时代_新浪网.files/tech;sz=1x1;num=28729036424615452">/SCRIPT

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

  功能及特色

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  正如其名称一样,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编程,这点应该引起你的注意。

  方法的重载

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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函数进行终止操作。

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
深入GDI(图形设备接口)编程

什么叫面向接口编程

编程语言 网络编程
什么叫面向接口编程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

深入浅出Linux设备驱动编程之内核模块

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
深入浅出Linux设备驱动编程之内核模块

文件和设备编程

编程语言 网络编程
文件和设备编程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java编程讨论:关于什么叫面向接口编程

编程语言 网络编程
Java编程讨论:关于什么叫面向接口编程

java比较器Comparable接口与Comaprator接口的深入分析

编程语言 网络编程
java比较器Comparable接口与Comaprator接口的深入分析

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何获取自己在程序中运行的外部EXE的Handle?

如何获取自己在程序中运行的外部EXE的Handle?

HTML标记语言——表单

HTML标记语言——表单
下拉加载更多内容 ↓