GDI+编程基础(一)GDI+ Vs GDI
GDI基础
预备知识
GDI(Graphics Device Interface) DC(Device Context)
本章授课内容
GDI概述 设备环境(Device Context) 内存设备(Memory Device Context)
GDI概述
GDI概述
GDI是图形设备接口(Graphics Device Interface或Graphical Device Interface)的 简称,它是微软公司的视窗操作系统(Microsoft Windows)的三大内核部件(也称“子系统”)之一。 GDI主要任务是负责系统与绘图程序之间的信息交换, 处理所有Windows程序的图形输出。 利用GDI所提供的众多函数就可以方便的在屏幕、打印 机及其它输出设备上输出图形,文本等操作。 GDI的出现使程序员无需要关心硬件设备及设备驱动, 就可以将应用程序的输出转化为硬件设备上的输出,实 现了程序开发者与硬件设备的隔离,大大方便了开发工 作。
设备环境是windows内部使用的数据结构,它定义了 GDI函数在显示设备特定区域的工作方式。对视频显示 器来说,设备环境代表屏幕上的一块区域。 要想向某个区域输出文字或者绘制图形,必须先取得 代表此区域的设备环境句柄,以此句柄为参数调用的 GDI函数都是对该区域的操作。
case WM_PAINT: { char szText[] = “hello world!”; PAINTSTRUCT ps; hdc = ::BeginPaint(hwnd, &ps); ::TextOut(hdc,10,10,szText, strlen(szText)); ::EndPaint(hwnd,&ps); return 0; }
(C#)GDI+编程
Graphics g = this.CreateGraphics(); g.Clear(Color.White); Font f = new Font("隶书",20,FontStyle.Italic); Pen p = new Pen(Color.Green); g.DrawString("我叫徐守威!",f,p.Brush,50,50); g.Dispose(); p.Dispose(); } 截图:
Pen
定义用于绘制直线和曲线的对象。无法继承此类
Region 指示由矩形和.Drawing 命名空间中的常用结构
结构
说明
Color
表示 RGB 颜色
Point
表示在二维平面中定义的点、整数 X 和 Y 坐标的有序对
Rectangle 存储一组整数,共 4 个,表示一个矩形的位置和大小。对于更高级的区域函数,
截图:
2.Brush 类
Brush 类(画刷),用于填充图形。该类是一个抽象基类,不能直接实例化,可以通过派生类设置笔刷的
样式、颜色及线条的粗细。这里所谓的区域即在什么范围内使用画刷。Brush 类的派生类如表:
名称
说明
ImageBrush
图像绘制区域
LinearGradientBrush
C# 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) 是一种图形设备接口,它提供了一组函数和数据结构,用于在计算机屏幕上绘制图形和文本。
GDI 的工作原理可以简单概括如下:
1. 设备无关性:GDI 提供了一套抽象的图形操作接口,使得应用程序不需要关心底层硬件的差异。
它可以在不同类型的图形设备(如显示器、打印机)上执行相同的绘图操作。
2. 句柄管理:GDI 使用句柄来标识各种图形对象,例如窗口、画刷、字体等。
应用程序通过创建和使用这些句柄来操作图形对象。
GDI 负责管理这些句柄,包括分配、释放和查询对象。
3. 绘图操作:GDI 提供了一系列函数,用于在设备上进行绘图操作。
这些函数包括绘制线条、填充区域、绘制文本等。
应用程序可以根据需要调用这些函数来实现所需的图形效果。
4. 坐标系统:GDI 使用一个坐标系统来确定图形和文本的位置。
通常,坐标原点位于设备的左上角,水平向右为正,垂直向下为正。
应用程序可以使用坐标系统来定位和变换图形对象。
5. 双缓冲技术:为了避免绘图时的闪烁和不流畅现象,GDI 使用双缓冲技术。
在内存中创建一个临时的图像缓冲区,所有的绘图操作先在缓冲区中进行,然后再将整个缓冲区一次性地绘制到屏幕上,从而实现平滑的图形显示。
总之,GDI 是一个用于绘制图形和文本的图形设备接口,它提供了设备无关性、句柄管理、绘图操作、坐标系统和双缓冲等特性,使得应用程序可以方便地操作图形对象并实现所需的图形效果。
1。
GDI GDI 从入门到精通-第一讲资料
} PAINTSTRUCT;
7
通过CreateCompatibleDC 创建兼容内存DC 通过调用CreateCompatibleDC函数来创建与目标DC兼容的内 存DC。一般用于解决界面的闪烁问题。 代码片段: { HDC hMemDC = ::CreateCompatibleDC(hDest); //其他的绘图操作代码 … ::BitBlt(hDest,x,y,w,h,hMemDC,0,0,SRCCOPY); … ::DeleteDC(hMemDC); }
23
Bitmap的结构
BMP文件总体上由4部分组成,分别是位图文件头、位图信息 头、调色板和图像数据。
24
Bitmap的结构
位图文件头包含了图像类型、图像大小、图据存放地址和两个保 留未使用的字段。 typedef struct tagBITMAPFILEHEADER { WORD bfType; //图像类型 DWORD bfSize; //图像大小 WORD bfReserved1; //保留未使用的字断 WORD bfReserved2; //保留未使用的字断 DWORD bfOffBits; //图像数据存放地址 } BITMAPFILEHEADER
4
通过GetDC函数 来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。 代码段: { HDC hDC = ::GetDC(hWnd); //其他的绘图操作代码 …… ::ReleaseDC(hWnd,hDC); } GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
//亮灰色画刷
//灰色画刷 //暗灰色画刷 //黑色画刷 //空画刷
#define HOLLOW_BRUSH
vbGDI编程01_初识GDI+
vbGDI编程01_初识GDI+第一节认识GDI+现在先让我们了解下GDI+的绘图机制。
1.初始化、关闭GDI+在VB6.0中使用GDI+,需要先对GDI+进行初始化,才能使用它的各种功能。
如果没有初始化,那么VB6.0就会崩溃。
程序结束时我们还要关闭GDI+释放内存。
2.GraphicsGraphics是GDI+基础。
首先我们需要一个画布对象graphics (可以看作是画板),我们所有的东西都要画在这个画布上面。
那么如何得到画布呢?我们可以通过GDI+内置函数从一个对象的Hdc(设备描述表)上创建graphics。
这样我们操作graphics的时候就会显示在对象上。
当然我们还可以从对象的hwnd中创建,也可以从gdi+的图像(image)中创建。
3.绘图工具有了画板,我们还要画笔、画刷才能画画。
画笔、画刷在gdi+中就叫做pen、brush。
画笔pen只能画一个轮廓(画线),而画刷brush可以对一个东西进行填充。
4.创建第一个VB6的 GDI+ 程序(在窗体上面画一条红线)首先,我们在窗体Form中添加GDI+模块;然后我们需要对画布的容器(容器可以是如:窗体Form、图片框PictureBox等)属性进行设置:AutoRedraw=True,开启自动重绘;再把ScaleMode设置成3(Pixel像素),因为GDI+基础单位就是像素(当然可以用别的单位)。
好,现在我们把窗体Form作为容器,在窗体上面画一条线,双击窗体写入下面代码:Private Sub Form_Load()Dim Graphics As LongDim Pen As LongInitGdiplusGdipCreateFromHDC Me.HDC, GraphicsGdipCreatePen1 &HFFFF0000, 1, UnitPixel, PenGdipDrawLineI Graphics, Pen, 10, 10, 200, 100GdipDeletePen Pen '删除这个笔(Pen)GdipDeleteGraphics Graphics '释放Graphics占用的内存TerminateGdiplusMe.RefreshEnd SubOK,F5运行。
GDI GDI+从入门到精通-第三讲GDI+编程的基本概念
14
HatchBrush创建影线画刷
创建代码如下: Color black(255,0,0,0); Color white(255,255,255,255);
HatchBrush brushA(HatchStyleHorizontal, black, white); //水平 横线
HatchBrush brushB(HatchStyleVertical, black, white); //垂直坚线
HatchBrush brushC(HatchStyleCross, black, white); //十字网格线
15
HatchBrush创建影线画刷
• 前景色与背景色的关系,就像 国际象棋盘,第一块为背景色 ,第二块为前景色,第三块为 背景色,如图:
21
Graphics绘制图片
把图片的指定区域绘制在指定位置的方法如下:
DrawImage(Image* image, INT x, INT y, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit); DrawImage(Image* image, REAL x, REAL y, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, Unit srcUnit);
23
Graphics绘制图片
把图片的指定区域绘制在指定目标区域的方法如下:
DrawImage(Image* image, const Rect& destRect, INT srcx, INT srcy, INT srcwidth, INT srcheight, Unit srcUnit); DrawImage(Image* image, const RectF& destRect, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, Unit srcUnit);
GDI原理
GDI原理GDI,全称为图形设备接口(Graphics Device Interface),是一种用于在Windows操作系统中绘制图形的技术。
它提供了一种将图形显示在屏幕上的标准方法,同时也是Windows应用程序与显示设备之间通信的桥梁。
在本文中,我们将深入探讨GDI的原理及其工作方式。
首先,GDI通过使用设备无关的图形对象(如画笔、画刷、字体等)来描述图形。
这些图形对象可以在不同的输出设备上进行绘制,而无需对应用程序进行修改。
这种设备无关性使得GDI成为了一种非常灵活的图形绘制技术。
其次,GDI通过使用设备上下文(Device Context,简称DC)来实现图形的绘制。
设备上下文是一个与设备相关的数据结构,它包含了绘制图形所需的各种参数和信息。
应用程序可以通过GDI函数来获取设备上下文,并在其上进行图形的绘制操作。
另外,GDI还提供了一系列的绘图函数,用于在设备上下文中进行各种图形的绘制操作。
这些函数包括了直线绘制、矩形绘制、圆形绘制、文本输出等功能。
通过调用这些函数,应用程序可以实现各种复杂的图形绘制效果。
除此之外,GDI还支持图形的变换和组合操作。
应用程序可以通过GDI函数来对图形进行平移、旋转、缩放等变换操作,也可以将多个图形进行组合,实现复杂的图形效果。
最后,GDI通过使用裁剪区域来限制图形的绘制范围。
裁剪区域是一个与设备相关的区域,它可以用来限制图形的绘制范围,从而实现局部图形的显示和隐藏。
总的来说,GDI是一种强大而灵活的图形绘制技术,它为应用程序提供了丰富的图形绘制功能,并且具有良好的设备无关性。
通过使用GDI,应用程序可以实现各种复杂的图形效果,从而提升用户界面的质量和用户体验。
在本文中,我们对GDI的原理及其工作方式进行了深入的探讨,希望能够帮助读者更好地理解和应用GDI技术。
通过对GDI的学习和掌握,我们可以更加轻松地实现各种复杂的图形效果,从而为用户提供更加丰富和优秀的应用程序。
GDI
如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。
感谢观看
GDI+在区域(regions)方面对GDI进行了改进,在GDI中,Regions存储在设备坐标中,对Regions唯一可进 行图形变换的操作就是对区域进行平移。而GDI+用世界坐标存储区域(Regions),允许对区域进行任何图形变换 (譬如如图所示的缩放),图形变换以变换矩阵存储,下面例子是一个区域变换前后的例子(缩放、旋转、平移)
在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就 可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备 及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方 便了开发工作。
你可能会注意到上面显示的图形,红色未平移区域与变换后区域有一部分交叉区域,这一部分形成的梦幻效 果就是由GDI+支持的Alpha Blending(混合)实现的,利用alpha融合,你可以指定填充颜色的透明度,透明颜 色与背景色相互融合,填充色越透明,背景色显示越清晰,四个椭圆被填充了同样的颜色,但由于拥有不同的透 明度而呈现不同的显示效果。
GDI+提供了矩阵对象,一个非常强大的工具,使得编写图形的旋转、平移、缩放代码变得非常容易。一个矩 阵对象总是和一个图形变换对相起来,比方说,路径对象(PATH)有一个Transform方法,它的一个参数能够接 受矩阵对象的,每次路径绘制时,它能够根据变换矩阵绘制。下面的图形是一个图形变换前后的例子,变换按照 先缩放后旋转完成。
gdi+ 原理
gdi+ 原理GDI(Graphics Device Interface)是Windows操作系统中用于图形输出的接口。
它是Microsoft公司开发的一种图形处理标准,用于在Windows操作系统中实现各种图形设备和应用程序的图形输出。
在计算机科学中,GDI是一种非常常见的图形编程接口,它提供了一种方便的方式来访问各种图形设备和应用程序中的图形数据。
一、GDI的组成GDI主要由以下几个部分组成:1. 设备上下文(DC):设备上下文是GDI中的一个重要概念,它代表了一个特定的输出设备,如屏幕、打印机等。
在GDI中,设备上下文包含了与输出设备相关的各种信息,如分辨率、颜色格式等。
2. 画笔(Pen):画笔是GDI中的一个工具,它允许开发者在设备上下文中绘制各种形状和线条。
画笔包含了颜色、宽度、样式等属性。
3. 刷子(Brush):刷子是GDI中的另一个工具,它允许开发者在设备上下文中绘制填充。
刷子包含了颜色、粗细等属性,以及一个位图来表示实际的填充图案。
4. 字体(Font):字体是GDI中用于文本输出的一个重要概念。
开发者可以通过指定字体、大小、样式等属性来输出文本。
5. 区域(Region):区域是GDI中的一个概念,它允许开发者对设备上下文中的某个区域进行操作,如绘制、剪裁等。
区域由一组路径和形状组成,可以通过GDI的API进行操作。
二、GDI的工作原理GDI通过调用各种绘图函数来操作设备上下文,从而实现图形的输出。
这些绘图函数包括画线、填充、文本输出等。
开发者可以通过GDI提供的API来创建、使用和管理这些绘图函数。
GDI的工作原理可以分为以下几个步骤:1. 创建设备上下文:开发者首先需要创建一个设备上下文对象,指定输出设备的属性,如分辨率、颜色格式等。
2. 创建画笔和刷子对象:根据需要,开发者可以创建画笔和刷子对象,并设置它们的属性。
3. 调用绘图函数:开发者通过调用GDI提供的绘图函数,将画笔和刷子应用到设备上下文中,从而实现图形的输出。
GDI编程基础
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编程一、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+编程
1. 掌握GDI+基础知识 2. 学习GDI+基础编程
GDI 与 GDI+
GDI(Graphics Device Interface)
——图形设备接口,负责系统与绘图程序之间的 信息交换,处理所有Windows程序的图形输出 GDI+ 继承了GDI,是.Net Framework的绘图技术, 负责在显示屏幕和打印设备输出有关信息 1.GDI+对GDI进行了优化,并添加了许多新的功能
2. DrawEllipse
—— 绘制一个由边框(该边框由一对坐标、高度和宽度指定) 定义的椭圆
3. DrawImage
——在指定位置并且按原始大小绘制指awLines
——绘制一条或 一系列连接由坐标对指定的两个点的线条
5. DrawPie
——绘制一个扇形,该形状由一个坐标对、宽度、高度以及两 条射线所指定的椭圆定义
1.1 //绘制正切曲线 C#的优势
private void DrawSin() { int x1,x2; double y1,y2; double a; Pen myPen=new Pen(Color.Blue,3); x1=x2=0; y1=y2=panel1.Height/2; for (x2= 0;x2<panel1.Width;x2++) { a=2 * Math.PI*x2/panel1.Width; y2= Math.Tan(a); y2= (1y2)*panel1.Height/2; panel1.CreateGraphics().DrawLine(myPen,x1,(float)y1,x2,(float)y2); x1=x2; y1=y2; } }
_GDI+编程教程
第7章C#图形图像编程基础本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。
7.1 GDI+绘图基础编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数。
GDI 对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphice Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。
7.1.1GDI+概述GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:(1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。
(2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。
因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。
(3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。
我们要进行图形编程,就必须先讲解Graphics类,同时我们还必须掌握Pen、Brush 和Rectangle这几种类。
GDI+比GDI优越主要表现在两个方面:第(一)GDI+通过提供新功能(例如:渐变画笔和alpha混合)扩展了GDI的功能;第(二)修订了编程模型,使图形编程更加简易灵活。
7.1.2Graphics类Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics 与特定的设备上下文关联。
GDI 和GDI+概念整理
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 和应用程序之间的一层,提供了更直观且基于继承性的对象模型。
GDI+编程基础
Gdiplus::GdiplusShutdown(m_gdiplusToken);
returnCWinApp::ExitInstance();
}
(4)、在应用类的InitInstance函数中添加GDI+的初始化代码:
BOOL CGDIPlusApp::InitInstance(){
graphics.FillRectangle(&linGrBrush, 300, 50, 200, 100);
}
七、使用画笔
画笔常用于绘制图形的轮廓。GDI+的画笔除了常见的色彩和宽度外,还具有对齐方式,线帽,变换方式等属性。GDI+通过Pen类来定义画笔对象。
1、构造与使用画笔
Pen(brush, width);//用颜色与线宽构造一个画笔
4、矩阵和矩阵变换
在图形处理过程中常需要对其几何信息进行变换以便产生复杂的新图形,矩阵是这种图形几何变换最常用的方法。为了满足人们对图形变换的需求,GDI+提供了功能强大的Matrix类来实现矩阵的旋转、错切、平移、比例等变换操作,并且GDI+还支持Graphics图形和区域(Region)的矩阵变换。
ULONG_PTR m_gdiplusToken;
ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。
(3)、在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+:
2、设值宽度与对齐方式
06图形设备接口GDI基本概念
设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。
1. GDI的一些基本概念
Windows绘图过程和设备无关性的实现:
GDI处于设备驱动程序的上一层,当程序调用绘图函数时,GDI将绘图命令传送给当前设备的驱动程序,以调用驱动程序提供的接口函数。驱动程序的接口函数将Windows绘图命令转化为设备能够执行的输出命令,实现图形的绘制。不同设备具有不同的驱动程序,设备驱动程序是设备相关的。
如果采用MFC方法编程,MFC提供了不同类型的DC类,每一个类都封装了DC句柄,并且它们的构造函数自动调用获取DC的API函数,析构函数自动调用释放DC的API函数。因此,在程序中通过声明一个MFC设备环境类的对象就自动获取了一个DC,而当该对象被销毁时就自动释放了获取的DC。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。MFC的DC类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其它的MFC设备环境类都是CDC的派生类。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系统提供的一系列函数或使用设备环境的句柄HDC来间接地获取或设置设备环境结构中的各项属性,如显示器高度和宽度、支持的颜色数及分辨率等。如果采用SDK方法编程,获取DC的方法有两种:在WM_PAINT消息处理函数中通过调用API函数BeginPaint()获取设备环境,在消息处理函数返回前调用API函数EndPaint()释放设备环境。在其他函数中通过调用API函数GetDC()获取设备环境,调用API函数ReleaseDC()释放设备环境。
GDI编程小结-ChinaUnix博客-专业IT技术博客
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的功能。
windows gdi指标
GDI(图形设备接口)是Windows操作系统中的一个重要组件,用于在屏幕上绘制文本和图形。
以下是GDI的一些重要指标:
1. 颜色深度:表示图形中可以显示的颜色数量。
例如,24位颜色深度可以显示1600万种颜色。
2. 分辨率:表示屏幕上的像素密度,通常以每英寸点数(DPI)表示。
高分辨率可以提供更清晰的图像和文本。
3. 字体支持:GDI支持多种字体,包括TrueType和PostScript字体。
字体的大小和样式决定了文本的外观和可读性。
4. 图形绘制:GDI提供了多种绘制图形的函数,如线条、圆、多边形、曲线等。
这些函数可以用于创建各种形状和效果。
5. 图像处理:GDI支持对图像进行各种处理,如缩放、旋转、裁剪、颜色转换等。
这些功能可以帮助用户对图像进行编辑和美化。
6. 性能:GDI的性能取决于多个因素,如硬件性能、系统资源占用等。
在某些情况下,使用GDI可能会影响应用程序的运行速度和响应时间。
7. 兼容性:由于GDI是Windows操作系统的一部分,因此它与Windows操作系统和其他应用程序的兼容性较好。
总之,GDI是Windows操作系统中非常重要的组件之一,它提供了多种功能和指标,可以帮助用户创建高质量的图形和文本。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4、绘制和填充
GDI总是让形状轮廓绘制和填充使用同一个绘图函数,例如Rectangle。轮廓绘制需要一个画笔,而填充一个区域需要一个画刷。也就是说,不管我们是否需要填充所绘制的形状,我们都需要指定一个画刷,否则GDI采用默认的画刷进行填充。这种方式确实给我们带来了许多不便,现在GDI+将形状轮廓绘制和填充操作分开而采用不同的方法,例如DrawRectangle和FillRectangle分别用来绘制和填充一个矩形。
5、区域的操作
GDI提供了许多区域创建函数,如:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等。诚然,这些函数给我们带来了许多方便。但在GDI+中,由于为了便于将区域引入矩阵变换操作,GDI+简化一般区域创建的方法,而将更复杂的区域创建交由Path接管。由于Path对象是与设备环境分离开来的,因而可以直接在Region构造函数中加以指定。
int CGDIPlusApp::ExitInstance()
{
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return CWinApp::ExitInstance();
}
(4)、在应用类的InitInstance函数中添加GDI+的初始化代码: BOOL CGDIPlusApp::InitInstance()
2、样条曲线
对于曲线而言,最具实际意义的莫过于样条曲线。样条曲线是在生产实践的基础上产生和发展起来的。模线间的设计人员在绘制模线时,先按给定的数据将型值点准确地"点"到图板上。然后,采用一种称为"样条"的工具(一根富有弹性的有机玻璃条或木条),用压铁强迫它通过这些型值点,再适当调整这些压铁,让样条的形态发生变化,直至取得合适的形状,才沿着样条画出所需的曲线。如果我们把样条看成弹性细梁,那么压铁就可看成作用在这梁上的某些点上的集中力。GDI+的Graphics:: DrawCurve函数中就有一个这样的参数用来调整集中力的大小。除了样条曲线外,GDI+还支持原来GDI中的Bezier曲线。
}
�
显示颜色 = 源像素颜色 X alpha / 255 + 背景颜色 X (255 - alpha) / 255
GDI+的Color类定义了ARGB颜色数据类型,从而可以通过调整Alpha值来改变线条、图像等与背景色混合后的实际效果。
6、多图片格式的支持
GDI+提供了对各种图片的打开,存储功能。通过GDI+,我们能够直接将一幅BMP文件存储成JPG或其它格式的图片文件。
#pragma comment( lib, "gdiplus.lib" )
另一种方法是:选择"项目->属性"菜单命令,在弹出的对话框中选中左侧的"链接器->输入"选项,在右侧的"附加依赖项"框中键入gdiplus.lib,
(2)、在应用程序项目的应用类中,添加一个成员变量,如下列代码:
ULONG_PTR m_gdiplusToken;
其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。
(3)、在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+:
五、GDI+新特色
GDI+与GDI相比,增加了下列新的特性:
1、渐变画刷
以往GDI实现颜色渐变区域的方法是通过使用不同颜色的线条来填充一个裁剪区域而达到的。现在GDI+拓展了GDI功能,提供线型渐变和路径渐变画刷来填充一个图形、路径和区域,甚至也可用来绘制直线、曲线等。这里的路径可以视为由各种绘图函数产生的轨迹。
5、Alpha通道合成运算
在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。
Alpha混色是将源像素和背景像素的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示
3、“当前位置”
GDI绘图操作(如画线)中总存在一个被称为"当前位置"的特殊位置。每次画线都是以此当前位置为起始点,画线操作结束之后,直线的结束点位置又成为了当前位置。设置当前位置的理由是为了提高画线操作的效率,因为在一些场合下,总是一条直线连着另一条直线,首尾相接。有了当前位置的自动更新,就可避免每次画线时都要给出两点的坐标。尽管有其必要性,但是单独绘制一条直线的场合总是比较多的,因此GDI+取消这个"当前位置"以避免当无法确定"当前位置"时所造成的绘图的差错,取而代之的是直接在DrawLine中指定直线起止点的坐标。
4、矩阵和矩阵变换
在图形处理过程中常需要对其几何信息进行变换以便产生复杂的新图形,矩阵是这种图形几何变换最常用的方法。为了满足人们对图形变换的需求,GDI+提供了功能强大的Matrix类来实现矩阵的旋转、错切、平移、比例等变换操作,并且GDI+还支持Graphics图形和区域(Region)的矩阵变换。
// 使用路径构造一个画刷
PathGradientBrush pthGrBrush(&path);
// 将路径中心颜色设为蓝色
pthGrBrush.SetCenterColor(Color(255, 0, 0, 255));
// 设置路径周围的颜色为蓝芭,但alpha值为0
四、编程模式的变化
“GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI是有状态的,GDI+是无无状态的。
1、不再使用设备环境或句柄
在使用GDI绘图时,必须要指定一个设备环境(DC),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。而GDI+不再使用这个设备环境或句柄,取而代之是使用Graphics对象。与设备环境相类似,Graphics对象也是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。但是,只有这个Graphics对象与设备环境句柄还存在着联系,其余的如Pen、Brush、Image和Font等对象均不再使用设备环境。
{
CWinApp::InitInstance();
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
GDI+编程基础(一)GDI+ Vs GDI
作者:李昊
下载源代码
一、GDI
GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作。它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备。GDI是以文件的形式存储在系统中,系统需要输出图形时把它载入内存,如果转换成硬件命令时遇到非GDI命令,系统还可能载入硬件驱动程序,驱动程序辅助GDI把图形命令转换成硬件命令。
除了上述新特性外,GDI+还将支持重新着色、色彩修正、消除走样、元数据以及Graphics容器等特性。
六、中使用GDI+的方法
在Visual C++.NET使用GDI+一般遵循下列步骤:
(1)、在应用程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加:第一种是直接在stdafx.h文件中添加下列语句:
3、独立的路径对象
在GDI中,路径是隶属于一个设备环境(上下文),也就是说一旦设备环境指针超过它的有效期,路径也会被删除。而GDI+是使用Graphics对象来进行绘图操作,并将路径操作从Graphics对象分离出来,提供一个GraphicsPath类供用户使用。这就是说,我们不必担心路径对象会受到Graphics对象操作的影响,从而可以使用同一个路径对象进行多次的路径绘制操作。
二、设备环境
Windows系统是用来给应用程序提供设备独立性的工具,它是windows系统为了处理输出设备而使用的一种内部数据结构,设备环境是windos程序,驱动程序,和输出设备(如打印机,绘图仪)之间的纽带,GDI是一组C++类,它在驱动程序的协助下把数据描绘在硬件上,它位于应用程序与硬件之间,把数据从一方传到另一方。在Visual Studio .NET中Micro$oft解决了GDI中的许多问题,并让它变得易用,GDI的.net版本叫做GDI+。
Color colors[] = {Color(0, 0, 0, 255)};
INT count = 1;