图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,负责在显示器和打印机上显示图形。
GDI由几百个函数调用和一些相关数据类型组成,包含在GDI32.dll动态连接库中。GDI命令通过设备驱动程序访问显示器和打印机设备。GDI支持与设备无关的图形。
图形输出设备分为两大类:光栅设备和矢量设备。显示器、打印机都是光栅设备,它们以点模式表示图像。矢量设备使用线来绘制图像。
在屏幕或打印机上显示的图形类型本身可以被分为几类,通常称为“图元”。它们是:
u 直线和曲线 线条是所有矢量图形绘制系统的基础。线条用设备描述表中选中的当前画笔绘制。
u 填充区域 当一系列直线或曲线封闭了一个区域时,该区域就可以当前GDI画刷对象进行填充。画刷可以是实现色彩、图案或者位图。
u 位图 位图是位的矩形数组。这些位对应显示设备上的象素,它们是光栅图形的基础。GDI支持两种类型位图:老的“设备有关”位图,是GDI对象;新的“设备无关”位图,可以存储在磁盘文件中。
u 文本
无法简单分类的其他:
u 映射模式和变换 默认以象素为单位
u 元文件 以二进制形式存储的GDI命令的集合
u 区域 形状任意的复杂区
u 路径 GDI内部存储的直线和曲线的集合。路径可以用于绘图、填充和剪裁,还可以转换为区域。
u 剪裁 绘图可以限制在客户区的某一部分中,这就是所谓的剪裁。剪裁通常通过区域或路径来定义。
u 调色板 定制调色板通常限于显示256色的显示器。可以改变除20种系统保留外的236种色彩。
要在一个图形输出设备(显示器或打印机)上绘图,必须先获得一个设备描述表句柄。设备描述表中包含许多确定GDI函数如何在输出设备上工作的当前“属性”。
最常用的获取并释放设备描述表句柄的办法是,在处理WM_PAINT消息时,调用BeginPaint和EndPaint;在处理非WM_PAINT消息时,调用GetDC和ReleaseDC(绘图区域为窗口客户区)以及GetWindowDC和ReleaseDC(绘图区域为整个窗口)。
BeginPaint、GetDC和GetWindowDC获得的设备描述表句柄都与显示器上的窗口有关。获取设备描述表句柄有一个更通用的函数是CreateDC:
hdc = CreateDC(pszDriver,pszDevice,pszOutput,pData);
…
Delete(hdc);
下列调用可获得整个屏幕的设备描述表句柄:
Hdc = CreateDC(TEXT(“DISPLAY”,NULL,NULL,NULL,NULL));
调用CreateIC函数可以获得一个信息描述表,无法使用它绘制图形。
调用CreateCompatibleDC函数创建一个兼容指定设备的内存设备描述表,显示表面默认只有一个单色象素宽度和高度。因此绘制前必须将一个合理宽度和高度的位图选进内存设备描述表,然后使用GDI函数在位图上绘图。
调用CreateMetaFile函数创建元文件:
hdcMeta = CreateMetaFile(pFileName);
…
Hmf = CloseMetaFile(hdcMeta);
一个设备描述表通常代表一个物理显示设备。调用GetDeviceCaps函数可获得有关该设备的信息。
打印机以“每英寸的象素数”表示分辨率;显示器以水平和垂直方向总的象素数如1024×768表示分辨率。调用GetSystemMetrics和GetDeviceCaps都可以得到屏幕象素数。字体大小一般以“磅“为单位表示。一磅大约等于1/72英寸。为什么都是10磅字体,还分大字体和小字体呢?一般情况下假定显示器分辨率为每英寸96个象素,而选择大字体时,假定为每英寸120象素。因此,屏幕分辨率越高,同一号字体越小。
一个象素颜色值可以以1位、8位、16位或者24位表示。GetDeviceCaps可返回指定设备上每个象素的颜色位数。一般使用COLORREF类型来表示颜色值,它是一个32位无符号长整数,从0-24位每8位分别代表红、绿、蓝值。
下表列举了设备描述表的基本属性以及获取和设置每一种属性的方法:
设备内容属性
默认值
修改该值的函数
取得该值的函数
Mapping Mode
MM_TEXT
SetMapMode
GetMapMode
Window Origin
(0, 0)
SetWindowOrgEx
OffsetWindowOrgEx
GetWindowOrgEx
Viewport Origin
(0, 0)
SetViewportOrgEx
OffsetViewportOrgEx
GetViewportOrgEx
Window Extents
(1, 1)
SetWindowExtEx
SetMapMode
ScaleWindowExtEx
GetWindowExtEx
Viewport Extents
(1, 1)
SetViewportExtEx
SetMapMode
ScaleViewportExtEx
GetViewportExtEx
Pen
BLACK_PEN
SelectObject
SelectObject
Brush
WHITE_BRUSH
SelectObject
SelectObject
Font
SYSTEM_FONT
SelectObject
SelectObject
Bitmap
None
SelectObject
SelectObject
Current Position
(0, 0)
MoveToEx
LineTo
PolylineTo
PolyBezierTo
GetCurrentPositionEx
Background Mode
OPAQUE
SetBkMode
GetBkMode
Background Color
White
SetBkColor
GetBkColor
Text Color
Black
SetTextColor
GetTextColor
Drawing Mode
R2_COPYPEN
SetROP2
GetROP2
Stretching Mode
BLACKONWHITE
SetStretchBltMode
GetStretchBltMode
Polygon Fill Mode
ALTERNATE
SetPolyFillMode
GetPolyFillMode
Intercharacter Spacing
0
SetTextCharacterExtra
GetTextCharacterExtra
Brush Origin
(0, 0)
(出处:http://www.sheup.com)