GDI 概述及功能用途.doc_第1页
GDI 概述及功能用途.doc_第2页
GDI 概述及功能用途.doc_第3页
GDI 概述及功能用途.doc_第4页
GDI 概述及功能用途.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GDI+概述及功能用途1 概述2 .NET Framwork 2.0图形设备接口比较3 图形描述对象(Grphics)4 画笔(Pen),画刷(Brush)及文本(Font)5 OnPaint绘图6 GDI+坐标系统7双缓存及无抖动绘图8 GDI+和windows form控件的结合1 概述GDI+ 由 .NET 基类集组成,这些基类可用于在屏幕上完成定制绘图,能把合适的指令发送到图形设备的驱动程序上,确保在监视器屏幕上显式正确的输出(或打印到硬拷贝中)。GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有 关信息,它是一组通过C+类 实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中 GDI进行了优化,并添加了许多新的功能。 GDI+ 提供了一个抽象层,隐藏了不同视频卡之间的区别,这样就可以调用 Windows API 函数完成指定的任务了,GDI 会在内部之处在运行特定的代码时,如何让客户机的视频卡完成要绘制的图形。大多数计算机都有多个显式设备比如监视器和打印机。GDI 成功地使应用程序所使用的打印机看起来与屏幕一样。GDI 给开发人员提供了一个相当高级的 API,但它仍然是一个基于旧的 Windows API 并且有 C 语言风格函数的 API,所以使用起来不是很方便。GDI+ 基本上是 GDI 和应用程序之间的一层,提供了更直观、基于继承性的对象模型。尽管 GDI+ 基本上是 GDI 的一个包装器。图1 GDI+体系结构Fig. 1 GDI+ architecture2 .NET Framwork 2.0图形设备接口比较GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一 个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对设备驱动 程序的调用。为实现图形设备无关性,Windows 的绘图操作在一个设备描述表上进行。用户拥有自己的逻辑坐标系统,它独立于实际的物理设备,与设备坐标相对应。开发Windows应用程序时,程序员关心的是逻辑坐标,我们在逻辑坐标系上绘图,利用GDI将逻辑窗口映射到物理设备上。2)GDI能检测具体设备的能力,并依据 具体的设备以最优方式驱动这些设备,完成真实的显示。GDI函数大致可分类为:设备上下文函数(如GetDC、CreateDC、 DeleteDC)、 画线函数(如LineTo、Polyline、Arc)、填充画图函数(如Ellipse、FillRect、Pie)、画图属性函数(如 SetBkColor、SetBkMode、SetTextColor)、文本、字体函数(如TextOut、GetFontData)、位图函数(如 SetPixel、BitBlt、StretchBlt)、坐标函数(如DPtoLP、LPtoDP、ScreenToClient、 ClientToScreen)、映射函数(如SetMapMode、SetWindowExtEx、SetViewportExtEx)、元文件函数 (如PlayMetaFile、SetWinMetaFileBits)、区域函数(如FillRgn、FrameRgn、InvertRgn)、路径函 数(如BeginPath、EndPath、StrokeAndFillPath)、裁剪函数(如SelectClipRgn、 SelectClipPath)等。GDI虽然使程序员得到了一定程度的解脱,但是其编程方式仍很麻烦。譬如,显示一张位图,程序员 需要进行装入位图读取位图文件头信息启用设备场景调色板变换等一连串操作。而有了GDI+,这些问题便迎刃而解了。顾名思 义,GDI+是GDI的增强版。它是微软在Windows 2000以后操作系统中提供的新接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的托管类接口。GDI+主要提供了以下三类服务:1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类;2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类,它们 可用于显示、操作和保存BMP、JPG、GIF等图像格式。3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。GDI接口是基于函数的,而GDI+是基于C+类的对象化的应用程序编程接口,因此使用起来比GDI要方便。3 图形描述对象(Grphics)Graphics类是GDI+的核心,Graphics提供将对象绘制到显示设备的方法。Graphics可 以与特定设备的上下文相关联,是用于创建图形的对象。它封装了绘制直线、曲线、图形、图像和文本的方法,是GDI+实现绘制直线、曲线、图形、图像和文本 的类,是GDI+操作的基础类。Graphics类提供了可以在windows窗口程序界面上绘图的功能,可以利用Graphics绘制圆弧,曲线,Bezier曲线,椭圆,图像,线条,矩形和文本。给窗口获得Graphics对象有两种不同的方式。首先是重写OnPaint()事件,该事件是一个Form类继承Control类的虚拟方法。有时,需要直接在窗口中绘图,而无需等待OnPaint()事件,这个时候在窗体上调用CreateGraphics()方法就可以获得一个Graphics对象,这是Form类继承Control类的另一个方法。GDI+绘制处理的流程如下。1)创建Graphics对象。2)通过Graphics对象绘制线条、形状或文本。4 画笔(Pen),画刷(Brush)及文本(Font) Pen,Brush,Text都是GDI+用来绘图的工具,Graphics就好像是一个工具盒,这些都是工具盒里面的主要工具,通过使用各种工具就可以在界面上绘图。 Pen类是用来绘制各种直线和曲线的一种图形工具,GDI+的Pen类为画笔提供了丰富的方法。程序员可以使用new操作符在程序中新建一个画笔实例,Pen类包含的属性可以创建大约一百五十种钢笔,每个钢笔都会有预定义的颜色,可以在其构造函数中设定其线宽,样式,线的颜色等等属性,一般使用Pen画图形中的边框轮廓部分。Pen类有许多功能。可以创建一个绘制虚线的钢笔,创建线宽比1个像素宽的钢笔。Pen类有一个属性Alignment,该属性可以定义钢笔是否从左到右(或从上到下)绘制制定的线条。设置StartCap和EndCap属性可以指定线条的末端有箭头、菱形、方框或圆形。甚至可以使用CustomStartCap和CustomEndCap属性编写定制的起始端箭头和终止段箭头形状。Brush类是一般用来填充图形的内部。Brush类是一个抽象的基类。要实例化一个Brush对象,应使用派生于Brush的类,例如SolidBrush,TextureBrush和LineGriadentBrush。Brush类在System.Drawing命名空间中,但TextureBursh和LinearBrush类在System.Drawing.Drawing2D命名空间中。它分为以下几个类别,它们具有不同的属性:1)SolidBrush用一种单色填充图形。2)TextureBrush用一个位图填充图形。在构造这个画笔时,还指定了一个边框矩形和一个填充模式。边框矩形指定画笔使用位图的那一部分可以不使用整个位图。填充模式有许多选项,包括平铺纹理的Tile,TileFlipX,TileFlipY和TileFlipXY,它们指定连续平铺时翻转图像,使用TextureBrush可以创建出非常有趣和富有想象力的效果。3)LinearGradientBrush封装了一个画笔,该画笔可以绘制两种颜色渐变的图形,其中第一种以指定的角度逐渐过渡到第二种颜色。Font类是GDI+中用来绘制文本的类,主要封装了字体的3个主要特性:字体系列,字体大小和字体样式。Font类在System.Drawing命名空间中。在绘制文本时,如果制定了一个字体以及绘图界面,常常需要知道文本字符串的宽度(像素),显然,这就是为什么不同的字体会对字符串的宽度(像素)有不同影响的原因:小字体的宽度需要使用比较少的像素。使用Graphics对象的MeasureString()方法可以计算出给定字体的字符串宽度。5 OnPaint绘图 Windows会利用Paint事件通知应用程序需要完成一些重新绘制的要求。有趣的是,Form类已经执行了这个事件的处理程序,因 此不需要再添加处理程序了。Paint事件的Form1处理程序处理虚方法OnPaint()的调用,并给它传送一个参数PaintEventArgs,在绘图中只需重写OnPaint()执行画图操作。在实际绘图中可以使用重写OnPaint(),也可以为Paint事件添加自己的事件处理程序(例如Form1_Paint方法)来得到相同的结果,其方式与为其他Windows Form事件添加处理程序一样。 但是采用重写OnPaint()的方式要略为灵活一些,因为这样可以控制何时调用基类窗口进行处理。OnPaint()声明为protected。OnPaint()一般在类的内部,所以类 外部的其他代码不知道存在OnPaint()。PaintEventArgs是一个派生自EventArgs的类,一般用于传送有关事件的信息。PaintEvent Args有另外两个属性,其中比较重要的是Graphics实例,它们主要用于优化绘制 窗口中需要绘制的部分。这样就不必调用CreateGraphics(),在OnPaint()方法中获取设备环境了 。在OnPaint()中,首先从PaintEventArgs中引用Graphics对象,再像以前那样绘制图 形。最后调用基类的OnPaint()方法,这一步是非常重要的。我们重写了OnPaint()方法,完成了绘图工作,但Windows在绘图过程中可能会执行一些它自己的工作。这些工作都在.NET基类的OnPaint()方法中完成。 6 GDI+坐标系统在GDI+绘图中的坐标系统分为三类:全局坐标系统、页面坐标系统和设备坐标系统。页面坐标系与设备坐标系都是以设备的左上角为坐标原点,X水平向右为正,Y垂直向下为正。 页面坐标与设备坐标系的差异在于X,Y的单位不同:页面坐标系中的X,Y单位可以任意设定,如英寸、毫米等;而设备坐标系中,只有一种单位,那就是点或者 像素。1)全局坐标系就是我们日常工作的坐标系,缺省情况下x轴正方向水平向右,Y轴正方向垂直向下;我们可以将其进行旋转、平移等操作。2)页面坐标系是不能更改的,它是一个参照标准,将全局坐标最终转换为设备坐标。3)设备坐标系跟具体的设备有关,在显示器中,基本的单位是像素,在打印机中,基本单位是点(point)。 以上是在GDI+中的三种坐标系统,这三种坐标系统在实际运用中是可以互换的,根据不同的需要,程序员使用不同的坐标系统。1)基本变换:平移及旋转 平移及旋转变换是最基本的全局变换,可以通过如下几种方式进行实 现:graphics:translatetransform,graphics:settransform 其中,translatetransform(int x,int y);如果x0则表示正方向移动,反之,向反方向移动。 2)改变坐标系,使Y轴垂直向上为正 这种转换,需要利用matrix来进行,称为仿射变形。 Matrix matrix(1.0f,0.0f,0.0f,-1.0f,x,y); Graphics.SetTransform(&matrix);/即可将Y轴转变成垂直向上为正 且平移(x,y)的距离。注,平移坐标转换是在新的全局坐标系下进行的,即操作的都是全局坐标系。 Matrix matrix(1.0f,0.0f,0.0f,-1.0f,0.0f,0.0f); graphics.SetTransform(&matrix); graphics.TranslateTransform(0,-100.0f);/平移是在新的全局坐标系下进行的,平移的也是全局坐标系本身,与页 面坐标系没有关系 graphics.DrawLine(&pen1,0,0,100,100); 如果在matrix中指定的x的比例不是1.0f的话,那就是全局坐标系中,x轴的比例发生了变化,如果大于1,则进行了放大,即相同大小的数值表 示的长度增长。反之,则缩小。 3)缩放并平移与缩放后平移的效果是不一样的,即此时的平移还是在原有的基础上进行的,因此,还是向下为正,即100。 GraphicsContainer container3=graphics.BeginContainer(); /X方向放大2倍,并平移100个单位 Matrix matrix(2.0f,0.0f,0.0f,-1.0f,100.0f,100.0f); graphics.SetTransform(&matrix); graphics.DrawLine(&pen1,0,0,100,0); graphics.EndContainer(container3); GraphicsContainer container4=graphics.BeginContainer(); /X方向放大2倍,然后再平移100个单位,这时,新的全局坐标系已经变为向上为正,所以向下为负,即-200。此时 Matrix matrix1(2.0f,0.0f,0.0f,-1.0f,0.0f,0.0f); graphics.SetTransform(&matrix1); graphics.TranslateTransform(100,-200.0f); graphics.DrawLine(&pen1,0,0,100,0); graphics.EndContainer(container4); 缩放的同时平移,只向右平移了在没有放大前的100个单位7双缓存及无抖动绘图在使用GDI+进行绘图过程处理时,如果图形刷新很快,经常出现图形闪烁的现象。利用先在内存绘制,然后拷贝到屏幕的办法可以消除屏幕闪烁,具体的方法将要绘制的界面先绘制在内存中一个虚拟的、和正在显示的界面同样大小的一个区域上,然后在这个内存区进行绘制图形。界面变化时将这个内存中的图象一次性绘制到屏幕上。在C#中通常都会把绘图区域开辟一个区域,然后将其存储成一个位图,然后把这个位图当作内存中的缓冲区,在这个位图上进行绘图,画完之后再将这个图重新显示在绘图区域的控件之上。其逻辑用代码表示如下:Graphics gxOff;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论