GDI GDI+从入门到精通-第三讲GDI+编程的基本概念
- 格式:ppt
- 大小:300.50 KB
- 文档页数:55
GDI编程小结分类:C/C++技术资料2010-10-18 20:20 1500人阅读评论(1) 收藏举报图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。
GDI负责Windows的所有图形输出,包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面。
也就是Windows的图形编程。
一、GDI体系结构1、GDI32.DLL导出的函数GDI提供几百个Windows程序中可以调用的函数。
这些函数大多数是从Win32的子系统DLL GDI32.DLL中导出的。
窗口管理模块UER32.DLL是使用GDI函数的大用户,它用GDI函数来绘制菜单、图标、滚动条、标题栏和每个窗口的框架等细节内容。
有一些绘图函数从USER32.DLL导出,提供给应用程序。
仅Windows2000 GDI32.DLL就导出了543个入口点。
与DevStudio一起发行的dumpbin工具是一个简单的工具,能列出模块导出的函数。
下面就是由dumpbin gdi32.dll /export 产生的部分内容:AbortDocAbortPathAddFontMemResourceExAddFontResourceAAddFontResourceE xAAddFontResourceExWAddFontResourceTrackingAddFontResourceWAngleArcAn imatePaletteAnyLinkedFontsArcArcTo具体查看:/del/archive/2008/03/11/1101291.html2、GDI函数分类GDI的功能太多了,所以我们需要一种办法对Win32 GDI API的函数分类,以便理解GDI的结构,MSDN库将GDI API分成17个领域,清楚地描述了GDI的功能。
C# GDI+编程之基础篇一、关于GDI+从本质上来看,GDI+为开发者提供了一组实现与各种设备(例如监视器,打印机及其它具有图形化能力但不及涉及这些图形细节的设备)进行交互的库函数。
GDI+的本质在于,它能够替代开发人员实现与例如显示器及其它外设的交互;而从开发者角度来看,要实现与这些设备的直接交互却是一项艰巨的任务。
下图1展示了GDI+在开发人员与上述设备之间起着重要的中介作用。
其中,GDI+为我们“包办”了几乎一切—从把一个简单的字符串“HelloWorld”打印到控制台到绘制直线,矩形甚至是打印一个完整的表单等。
图1.GDI+担当着重要的中介作用那么,GDI+是如何工作的呢?为了弄清这个问题,让我们来分析一个示例—绘制一条线段。
实质上,一条线段就是一个从一个开始位置(X0,Y0)到一个结束位置(Xn,Yn)的一系列像素点的集合。
为了画出这样的一条线段,设备(在本例中指显示器)需要知道相应的设备坐标或物理坐标。
然而,开发人员不是直接告诉该设备,而是调用GDI+的drawLine()方法,然后,由GDI+在内存(即“视频内存”)中绘制一条从点A到点B的直线。
GDI+读取点A和点B的位置,然后把它们转换成一个像素序列,并且指令监视器显示该像素序列。
简言之,GDI+把设备独立的调用转换成了一个设备可理解的形式;或者实现相反方向的转换。
至此,我们已经简单了解了GDI+的工作机理。
现在,让我们开始探讨如何实现一些基本的图像操作。
二、图像操作—缩略图,缩放与保存在本文示例中,我们将实现如下的任务:1. 创建缩略图。
2. 缩放一个加载的图像。
3. 保存一个操作中的图像。
a) 创建缩略图缩略图是图像的浓缩版本。
典型情况下,一幅缩略图图像的尺寸为80×200像素。
在GDI+中,一个图像的缩略图可以通过使用Image类的GetThumbnailImage()方法来创建。
其函数原型如下:public Image GetThumbnailImage(int thumbWidth,int thumbHeight,GetThumbnailImageAbortcallback,IntPtr callbackData)第一个参数相应于缩略图的宽度;第二个参数相应于生成的缩略图的高度;第三个参数是一个Image.GetThumbnailImageAbort委托。
GDI编程基础GDI(Graphics Device Interface,图形设备接口)是在Windows平台上处理图形、图像的方法,它是一套API函数;它们功能丰富,使用起来简单、灵活。
下面,我们首先来介绍一些GDI编程的基础知识。
GDI函数有很多,我们大致可以把它们分成如下几类:· 设备上下文(Device Context,简称DC)函数,如GetDC、CreateDC、DeleteDC等;· 画线函数,如LineTo、Polyline、Arc等;· 填充画图函数,如Ellipse、FillRect、Pie等;· 画图属性函数,如SetBkColor、SetBkMode、SetTextColor等;· 文本、字体函数,如TextOut、GetTextExtentPoint32、GetFontData等;· 位图函数,如SetPixel、BitBlt、StretchBlt等;· 坐标函数,如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen等;· 映射函数,如SetMapMode、SetWindowExtEx、SetViewportExtEx等;· 元文件(MetaFile)函数,如PlayMetaFile、SetWinMetaFileBits等;· 区域(Region)函数,如FillRgn、FrameRgn、InvertRgn等;· 路径(Path)函数,如BeginPath、EndPath、StrokeAndFillPath等;· 裁剪(Clipping)函数,如SelectClipRgn、SelectClipPath等。
上述这些函数可以完成绘制用户界面中的各个部分,包括我们在Windows平台上司空见惯的窗口、菜单、工具条、按钮等。
GDI编程GDI编程一、GDI相关概念1、 GDI(Graphics Device Interface):图形设备接口,是一个应用程序与输出设备之间的中介。
它提供了一套函数库,这些函数在不同的输出设备上输出图形和文字。
一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。
2、DC (Device Context):设备描述表(设备上下文),是一种Windows数据结构,包括了如线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等信息。
用于表达显示器、打印机等设备。
DC的主要作用是进行绘图和输出文字,如绘制线条、形状和文本等,具体如dc.MoveTo(),dc.LineTo(),dc.Ellipse(),dc.FillRect(),dc.FillSolidRect(),dc.TextOut()等。
Win32下与HDC相关的函数有:GetDC(), BeginPaint()/EndPaint(),GetWindowDC()等对应的MFC版本的类有:CDC, CPaintDC, CClientDC, CWindowDC等3、GDI对象:DC定义了一组GDI对象,包括画笔,画刷,字体,位图,调色板,剪裁区域,路径层(Path)。
他们有Win32和MFC两套实现版本,其对应关系如下:4、DC与GDI对象之间的关系:GDI对象是通过DC发生作用的,要使用这些GDI对象,可以使用Win32函数SelectObject来将其选入DC中,如::SelectObject(hdc, hPen);5、利用DC和GDI对象绘图的完整步骤为:(1). 获取或者创建一个DC(2). 获取或者创建一个GDI对象(Pen, Brush等)(3). 使用dc.SelectObject函数把GDI对象选入DC(4). 使用DC进行绘图或文字输出(5). 恢复DC原来的GDI对象并删除刚新创建的GDI对象,如pen.DeleteObject()(6). 释放或删除设备描述表DC其中,(1)和(6),(2)和(5)是成对出现的。
GDI 和GDI+这几天我自己在研究GDI,找到一些资料,和一些自己的总结笔记,拿出来和大家分享下。
一般来说,Windows 的一个优点(实际上通常是现代操作系统的优点) 是它可以让开发人员不考虑特定设备的细节。
例如,不需要理解硬盘设备驱动程序,只需在相关的.NET 类中调用合适的方法(在.NET 推出之前,使用等价的Windows API 函数),就可以编程读写磁盘上的文件。
这条规则也适用于绘图。
计算机在屏幕上绘图时,它把指令发送给视频卡。
问题是市面上有几百种不同的视频卡,大多数有不同的指令集和功能。
如果把这个考虑在内,在应用程序中为每个视频卡驱动程序编写在屏幕上绘图的特定代码,这样的应用程序就根本不可能编写出来。
这就是为什么在Windows 最早期的版本中就有Windows 图形设备界面(Graphical Device Interface,GDI)的原因。
GDI 提供了一个抽象层,隐藏了不同视频卡之间的区别,这样就可以调用Windows API 函数完成指定的任务了,GDI 会在内部指出在客户运行特定的代码时,如何让客户端的视频卡完成要绘制的图形。
GDI 还可以完成其他任务。
大多数计算机都有多个显示设备——例如,显示器和打印机。
GDI 成功地使应用程序所使用的打印机看起来与屏幕一样。
如果要打印某些东西,而不是显示它,只需告诉系统输出设备是打印机,再用相同的方式调用相同的Windows API 函数即可。
可以看出,DC(设备环境)是一个功能非常强大的对象,在GDI 下,所有的绘图工作都必须通过设备环境来完成。
DC 甚至可用于不涉及在屏幕或某些硬件设备上绘图的其他操作,例如,在内存中修改图像。
GDI 给开发人员提供了一个相当高级的API,但它仍是一个基于旧的Windows API 并且有C 语言风格函数的API,所以使用起来不是很方便。
GDI+在很大程度上是GDI 和应用程序之间的一层,提供了更直观且基于继承性的对象模型。