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

2016-02-19 12:47 7 1 收藏

今天图老师小编要跟大家分享深入GDI(图形设备接口)编程,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

    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+图形系统,图形和艺术字将具有更平滑的轮廓,以及可调整的用真实颜色调和的透明度级别。在调整图片大小时,图片的显示将会更加清晰。

  功能及特色

  正如其名称一样,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://www.tulaoshi.com/bianchengyuyan/)

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

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

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

来源:http://www.tulaoshi.com/n/20160219/1601962.html

延伸阅读
Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具。相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便 得多。本文将结合作者编程经验,以VC6.0和Matcom为例,详细介绍如何利用Matcom进行VC与Matlab的联合编程。 Matcom安装安装Matcom前要已求安装VC6.0。在安装过程中出现选择编译器对话框,选择是...
VB没有提供直接读写I/O口的方法。所以只能借助其他语言来编写DLL,然后在VB中调用。  如果你在Windows下使用过C/C++,那么编写这样的DLL可能没有什么困难。在C语言里都包括inp和outp函数。可以把下面这段C语言代码(32位)编译生成DLL,然后在VB中调用。  代码如下:  #include #include /*作用...
标签: Delphi
  在 Delphi 中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,能得到不同风格的图形。另外,通过对鼠标事件的定义,可以方便的设计图形绘制程序。 本章将介绍以下内容: 1. TCanvas,TPen,TBrush,TColor对象的方法及属性; ...
像Java一样,C#提供了一整套相当丰富的类库、方法以及事件以供开发者使用。C#还引入了GDI+,它是由GDI演变而来的,具有比GDI更强大的功能而且简化了程序员的编程工作。所以开发者运用这些,就可以很方便的开发出具有强大图形图像功能的应用程序了。本文,笔者就通过一些实例像读者介绍一下C#中的图形编程的基本知识。 简单实例: ...
标签: Delphi
  直线时,用户只有在松开鼠标才能看见直线,对直线的变化不能进行实时观测。这是因为鼠标移动时程序没有进行某种应。 Delphi 定义了 OnMouseMove事件来响应鼠标移动。以下代码可使用户随时观测直线的变化: procedure TForm1.FormMouseMove(Sender:Tobject) begin Drowto(X,Y); Moveto(origin); end. origin是起始点。 ...

经验教程

287

收藏

86
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部