GDIGDI 从入门到精通-第三讲资料
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; }
GDI使用介绍

每个像素4个BYTE,分别存储RGBA,A值就是Alpha,也就是透明度,可以用像素混合算法实现多种效果
,后面你就会看到。
Windows下的基本动画系统
动画驱动方式
先略说一下动画的基本原理,程序播放动画一般过程都是: 绘制―擦除―绘制,这样的重复过程,只要
你重复的够快,至少每秒16次(被称作16FPS,Frame per Second),我们可怜的眼睛就分辨不出单帧的图
file://假设hwnd是要绘制的窗口的HANDLE
HDC hwnddc=::GetDC(hwnd);
HDC memdc=::CreateCompatibleDC(hwnddc);
HBITMAP oldbmp=::SelectObject(memdc,hbmp);
解,现在就去翻一翻Windows编程的书吧。
首先我们要Load一个Bitmap对象,使用Win32 API可以写成这样:
file://从资源Load一个位图,如果从文件load的话,可以使用::LoadImage()
HBITMAP hbmp=::LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_MYBMP));
如果使用MFC可以这样写:
CBitmap bmp;
Bmp.LoadBitmap(IDB_MYBMP);
想把这个位图对象绘制到窗口上就要先得到窗口的DC,然后对这个DC操作。请留意创建MemoryDC的代码,
后面会用到。
Win32 API的版本:
file://假设位图大小为100*100像素
前言 2
GDI基础 3
绘制一个位图(BITMAP)对象 3
GDI学习总结

上海鼎为通讯科技有限公司 上海鼎为通讯科技有限公司 鼎为通讯科技 Dewav Communication Technology Co.,Ltd.GDI 学习总结文件编号 Doc. No. : 页数 Page : 12 报告人:Neil 版本 Version :V1.0上海鼎为通讯科技有限公司1历次修正记录序号 1 变更 日期 2010-10-1 1 原因创建文档变更摘要版本1.0提出者Neil批准2目 录1 GDI 简介 ....................................................................................................................................... 4 2 GDI 功能描述和架构分析............................................................................................................ 4 3 2D APIs 和文本功能 ..................................................................................................................... 6 3.1 点........................................................................................................................................ 6 3.2 线........................................................................................................................................ 6 3.3 框........................................................................................................................................ 6 3.4 文本.................................................................................................................................... 7 3.4.1 字体.......................................................................................................................... 7 3.4.2 带边框的文本 ......................................................................................................... 7 4 层 .................................................................................................................................................. 7 4.1 准备.................................................................................................................................... 8 4.2 创建层................................................................................................................................ 8 4.3 激活层................................................................................................................................ 9 4.4 基础层.............................................................................................................................. 10 4.5 合并层.............................................................................................................................. 11 4.6 层坐标系.......................................................................................................................... 11 4.7 剪切.................................................................................................................................. 12 4.8 透明度............................................................................................................................... 12 4.9 通透.................................................................................................................................. 12 4.10 图像旋转........................................................................................................................ 13 5 流程跟踪..................................................................................................................................... 15 6 参考文档..................................................................................................................................... 1531 GDI 简介GDI 是 Graphics Device Interface 的缩写,含义是图形设备接口,它的主 要任务是负责系统与绘图程序之间的信息交换, 处理所有 Windows 程序的图形输 出。
Windows程序GDI绘图PPT课件

►1.设备场境 ►Windows对图形显示设备进行了封装,形成了一个统一的虚
拟图形显示设备。应用程序可以在这个虚拟设备上进行绘图, 而虚拟设备图形转换为物理设备图形的任务则由设备驱动程 序去完成。这个虚拟图形设备用一个包含各种设备属性的数 据结构来表示,称为设备场境DC(device content),又称 设备上下文。如图所示,设备场境DC是指可以用来输出图形 的对象,例如显示器、打印机、某个窗口等等,设备场境句 柄HDC是指向某个设备场境的类似指针的数据类型。
6
13.2.7 图形输出
►Windows提供了几种获取设备场境句柄的方法。如果在处理 一条消息时获取了设备场境句柄,那么应该在退出窗口过程 WndProc之前释放它或者删除它。一旦释放了DC句柄,它就 不能再使用了。
7
13.2.7 图形输出
►最常用的获取设备场境句柄的方法是在处理WM_PAINT消息 时,使用BeginPaint和EndPaint调用:
12
13.2.7 图形输出
►GetDC得到的设备场境句柄是窗口hWnd客户区的句柄。这 组调用与BeginPaint和EndPaint的区别是利用从GetDC返回的 句柄可以在整个客户区上绘图,然而GetDC不会使客户区中 任何区域可能的无效区域变成有效,从显示效果上来看, GetDC的绘图结果将会在下次WM_PAINT消息刷新后“消失” 了。
C#.net地图控件开发(五)GDI+图形图像编程基础3.

C#.net地图控件开发(五)GDI+图形图像编程基础3.画刷和画刷类型Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:HatchBrush、SolidBrush、T extureBrush、LinearGradientBrush和PathGradientBrush等。
画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间。
1. SolidBrush(单色画刷)它是一种一般的画刷,通常只用一种颜色去填充GDI+图形,例如:protected override void OnPaint(PaintEventArgs e){Graphics g = e.Graphics;SolidBrush sdBrush1 = new SolidBrush(Color.Red);SolidBrush sdBrush2 = new SolidBrush(Color.Green);SolidBrush sdBrush3 = new SolidBrush(Color.Blue);g.FillEllipse(sdBrush2, 20, 40, 60, 70);Rectangle rect = new Rectangle(0, 0, 200, 100);g.FillPie(sdBrush3, 0, 0, 200, 40, 0.0f, 30.0f );PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f);PointF point3 = new PointF(150.0f, 40.0f);PointF point4 = new PointF(250.0f, 50.0f);PointF point5 = new PointF(300.0f, 100.0f);PointF[] curvePoints = {point1, point2, point3, point4,point5 };g.FillPolygon(sdBrush1, curvePoints);}2. HatchBrush(阴影画刷)HatchBrush类位于System.Drawing.Drawing2D命名空间中。
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
GDI+绘图入门

使用字体
GraphicsUnit枚举类型,用于指定给定数据的度量单位。
Display,将 1/75 英寸指定为度量单位。 Document,将文档单位(1/300 英寸)指定为度量单位。 Inch,英寸。 Millimeter,毫米。 Pixel,设备像素。 Point,打印机点(1/72 英寸)。 World,通用单位。 Bold:设置字体风格为粗体; Italic:设置字体风格为斜体; Regular:常规字体; Strikeout:字体带删除线; Underline:字体带下划线。
Graphics对象
Graphics类提供的许多绘图方法有:
Clear方法:使用一种指定的颜色填充整修绘图表面。 例如,
Graphics^ g = this->CreateGraphics; g->Clear( this->BackColor ); //用当前控件的背景色填 充
绘制方法,一般都有多个重载,第一个参数一般都是 绘制画笔Pen类型:
包含的一些方法
Contains方法:确定一个矩形或一个点是否在当前矩形区域 内。参数类型可以是Point结构,Rectangle结构和点坐标值。 Union方法:求两个矩形的并集。参数是两个要求并集的矩形, 返回一个包含其并集的Rectangle结构。
Rectangle结构
Intersect方法:求两个矩形的交集。参数为两个求交的矩形, 则返回一个表示其交集的Rectangle结构;参数为一个矩形, 则获得当前矩形与参数矩形的交集Rectangle,用这个结果替 换当前矩形。
可以直接对Rectangle变量进行等于==或不等于!=操作。 正在绘制或操作一个控件的工作区时,常常使用Rectangle 结构。
GDI+学习资料

第5章 GDI+GDI+(Graphics Device Interface Plus 图形设备接口加)是Windows XP 和Windows Server 2003操作系统的图形子系统,也是.NET 框架的重要组成部分和窗体绘图的主要工具,负责在屏幕和打印机上绘制图形图像和显示信息。
顾名思义,GDI+是Windows 早期版本所提供的图形设备接口GDI 的后续版本。
GDI+是一种应用程序编程接口(API),分别通过一套C++类和一套部署为托管代码的类来展现,这两套类分别被称为GDI+的“C++封装”和“托管类接口”。
GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows 图形图像程序开发的主要工具。
本章将介绍GDI+的特点和新增功能,以及GDI+ API 的具体使用方法,包括二维矢量图形的绘制、图像处理的应用、以及文字的显示等。
由于本章内容较多,有些章节不作为基本要求,用*号表示的章节是可选的。
5.1 概述GDI+与GDI 一样,都具有设备无关性。
而且GDI+是建立在GDI 之上的一种高层接口,供Windows 应用程序和.NET 框架调用。
参见下图:GDI+的体系结构本节首先介绍GDI+的几个主要新增的特性及其功能,然后说明它给Windows 图形图像程序的开发模式带来的变化,最后给出一个代码实例,介绍如何在VC++中使用GDI+进行程序开发。
1.GDI+的功能GDI+主要提供了以下三种功能:1)二维矢量图形与MFC中代表GDI的CDC和CGDIObject的诸派生类(CPen、CBrush、CFont等)类似,GDI+的Graphics等类也提供绘制各种二维矢量图形(如直线、折线、矩形、椭圆、多边形等)的功能。
而且GDI+还增加了许多新的特性和功能,如无当前状态的绘图模式、含透明成分(α混色)的颜色类Color、图案笔、颜色可渐变的刷、贝塞尔和样条曲线、持久的路径、可伸缩的区域、功能强大的矩阵和变换等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12
SolidBrush创建单色画刷
SolidBrush(const Color &color); 下列的代码创建了一个蓝色的单色画刷。 SolidBrush blueBrush(Color(255,0,0,255));
13
HatchBrush创建影线画刷
HatchBrush(HatchStyle hatchStyle, const Color& foreColor, const Color& backColor); hatchStyle:影线画刷的类型 foreColor:影线画刷线条的前景色 backColor:影线画刷线条的背景色。
19
Graphics绘制图片
把图片绘制在指定位置的方法如下: DrawImage(Image* image,const Point& point);
DrawImage(Image* image,INT x,INT y);
DrawImage(Image* image, const PointF& point) DrawImage(Image* image, REAL x, REAL y); 其中x,y为要绘制的位置,可为INT类型,也可为REAL类型。 point为要绘制的位置的结构体变量,可为Point类型(内部成员为INT类型),也可为PointF类型( 内部成员为REAL类型)。
11
常用的画刷
单色画刷,类名SolidBrush,用纯色填充图形。 影线画刷,类名HatchBrush,用各种线型图案填充图形。 纹理画刷,类名TextureBrush,使用图像来填充图形。 线性渐变画刷,类名LinearGradientBrush,使用渐变的色彩填充图 形,渐变是指一种颜色沿着指定的方向慢慢变为另一种颜色。
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创建影线画刷
• 前景色与背景色的关系,就像 国际象棋盘,第一块为背景色 ,第二块为前景色,第三块为 背景色,如图:
16
TextureBrush创建纹理画刷
TextureBrush(Image *image); image为图像的指针。 如: Image image(L“TEXTURE.BMP”); TextureBrush textureBrush(&image);
24
Graphics绘制片
srcwidth,srcheight为图片指定区域的宽度与高度,可为INT类型, 也可为REAL类型。
srcUnit为Unit的枚举成员,它指定了所用的度量单位。
25
Graphics绘制文字
DrawString(const WCHAR *string, INT length, const Font *font, const PointF &origin, const Brush *brush); DrawString(const WCHAR *string, INT length, const Font *font, const RectF &layoutRect, const StringFormat *stringFormat, const Brush *brush); DrawString(const WCHAR *string, INT length, const Font *font, const PointF &origin, const StringFormat *stringFormat, const Brush *brush); 其中: string为要绘制的字符串,类型为const WCHAR*,宽字符指针。 length为要绘制的字符串的长串,如果该值为-1,表明绘制以NULL结尾的 string字符串。
7
Graphics类的构造
Graphics(HDC hdc); //以HDC构造Graphics,对Graphics的绘制操作,就绘制在hdc指定的位图中。
Graphics(HWND hwnd);
//以HWND构造Graphics,对Graphics的绘制操作,就绘制在hwnd窗口上。 Graphics(Image *image); //Image *是GDI+中的图像指针,对Graphics的绘制操作,就绘制在image所指的图 像对象中。
20
Graphics绘制图片
把图片绘制在指定区域的方法如下: DrawImage(Image* image, const Rect& rect); DrawImage(Image* image, INT x, INT y, INT width, INT height); DrawImage(Image* image, const RectF& rect); DrawImage(Image* image, REAL x, REAL y, REAL width, REAL height); 其中x,y为指定矩形区域的坐上角坐标,可为INT类型,也可为REAL类型。 width,height为指定矩形区域的宽度与高度,可为INT类型,也可为REAL类 型。 rect为指定的矩形区域,可为Rect类型(内部成员为INT类型),也可为 RectF类型(内部成员为REAL类型)。
2
GDI+的使用方法
在使用GDI+的cpp文件中包含GdiPlus.h文件,并引用命名空间 using namespace Gdiplus; 代码如下:
#include <GdiPlus.h>
using namespace Gdiplus;
3
GDI+的使用方法
需要在项目属性中作如下设置,以支持GDI+的静态库编译:
反初始化代码:
//销毁GDI+资源
GdiplusShutdown(uToKen);
6
透明度合成运算
透明度是像素之间的一种合成运算。它的计算公式是: 输出颜色=前景色*Alpha/255+背景色*(255-Alpha)/255 举个例子来说,假设有一个点,其颜色值为RGB(0,0,0),背景色值为 RGB(255,255,255),在进行输出时将透明度设置为100,输出的颜色为: Result.Red = 0*100/255+255*(255-100)/255 = 155 Result.Green = 0*100/255+255*(255-100)/255 = 155 Result.Blue = 0*100/255+255*(255-100)/255 = 155
18
Pen创建画笔
Pen(const Color &color, REAL width = 1.0f ); //color为画笔的颜色,width为画笔的宽度。 Pen(const Brush *brush, REAL width = 1.0f ); //brush为画刷的指针,width为画笔的宽度。通过画刷来构造 一个画笔,这种画笔绘制出来的线条,边框就犹如在一张带图案的纸 张上,剪出的指定宽度的线条,边框的效果。
9
Bitmap类的常用方法
Bitmap* Clone(const Rect& rect, PixelFormat format); Bitmap* Clone(INT x, INT y, INT width, INT height, PixelFormat format); Bitmap* Clone(const RectF &rect, PixelFormat format); Bitmap* Clone(REAL x, REAL y, REAL width, REAL height, PixelFormat format); //以上四个方法为Bitmap的拷贝方法,从源位图的指定区域拷贝出新的位图 对象出来,并用format像素格式应用在新的Bitmap对象中。
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);
10
Bitmap类的常用方法
UINT GetWidth(); //获取位图的宽度
UINT GetHeight(); //获取位图的高度
GetPixel(INT x, INT y, Color *color); //获取位图指定位置的颜色 SetPixel(INT X, INT y, const Color &color); //设置位图指定位置的颜色
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); destRect为指定目标区域。可为Rect类型(内部成员为INT类型),也可以RectF类型 (内部成员为REAL类型)。 srcx,srcy为图片指定区域的左上角的坐标,可为INT类型,也可为REAL类型。