图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形。GDI的主要目的之一是支持与设备无关的图形。
5.1GDI 的结构
GDI原理:
Windows 98和Microsoft Windows NT中的图形主要由GDI32.DLL动态链接库输出的函数来处理。图形输出设备分为两大类:位映像设备和向量设备。大多数PC的输出设备是位映像设备。
Windows内定使用图素坐标系统。大多数传统的图形语言使用「虚拟」坐标系,其水平和垂直轴的范围在0到32,767之间。Windows GDI允许您使用两种坐标系统之一。GDI通常是一个静态的显示系统,只有有限的动画支持。如果需要为游戏编写复杂的动画,就应该研究一下Microsoft DirectX。
GDI函数呼叫:
1.取得(或者建立)和释放(或者清除)设备内容的函数:BeginPaint,EndPaint,GetDC,RealseDC。
2.取得有关设备内容信息的函数:GetTextMetrics
3.绘图函数:TextOut
4.设定和取得设备内容参数的函数:SetTextColor(指定TextOut(或者其它文字输出函数)所绘制的文字色彩)和SetTextAlign。
5.使用GDI对象的函数:CreatePen、CreatePenIndirect或ExtCreatePen函数中指定这些特征来建立一个逻辑画笔。
GDI基本图形:直线和曲线,填入区域,位图,文字。
其它部分:
映像模式和变换:GDI映像模式允许您以英寸毫米或者任何您想使用的单位来绘图。
Metafile是以二进制形式储存的GDI命令集合。Metafile主要用于通过剪贴板传输向量图形。
绘图区域:绘图区域是形状任意的复杂区域。
路径:路径是GDI内部储存的直线和曲线的集合。
剪裁:绘图可以限制在显示区域的某一部分中,这就是所谓的剪裁。
调色盘:自订调色盘通常限于显示256色的显示器。
打印。
5.2设备内容
取得设备内容句柄:
在处理WM_PAINT消息时,使用BeginPaint和EndPaint。Windows程序还可以在处理非WM_PAINT消息时取得设备内容句柄GetDC和ReleaseDC。Windows程序还可以取得适用于整个窗口(而不仅限于窗口的显示区域)的设备内容句柄GetWindowDC。如果要使用GetWindowDC,必须拦截处理WM_NCPAINT消息。
Windows使用WM_NCPAINT消息在窗口的非显示区域上绘图。也就是窗体客户区以外的重绘消息。
取得设备内容句柄的另一个更通用的函数是CreateDC。hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);
CreateIC:只是需要取得关于某设备内容的一些信息而并不进行任何绘画。
使用位图时,取得一个「内存设备内容」hdcMem = CreateCompatibleDC (hdc);
metafile设备内容来建立metafile:hdcMeta = CreateMetaFile(pszFilename);
取得设备内容信息:
GetDeviceCaps:取得设备功能包括显示器的大小(单位为图素或者实际长度单位)和色彩显示能力。
DEVCAPS1程序:
Windows应用程序可以使用SM_CXSCREEN和SM_CYSCREEN参数从GetSystemMetrics得到图素尺寸。从DEVCAPS1程序中您会注意到,程序可以用HORZRES(水平分辨率)和VERTRES参数从GetDeviceCaps中得到同样的值。这里「分辨率」指的是图素大小而不是每度量单位的图素数。
HORZSIZE和VERTSIZE,文件中称为以毫米计的实际屏幕的宽度和高度。
ASPECTX、ASPECTY和ASPECTXY值是每一个图素的相对宽度、高度和对角线大小,四舍五入到整数。
LOGPIXELSX和LOGPIXELSY仍然与在「控制台」的「显示器」程序中选择的字体有关。
关于色彩:
iBitsPixel = GetDeviceCaps(hdc, BITSPIXEL); //传回每个图素的色彩位数
iPlanes = GetDeviceCaps(hdc, PLANES);//传回色彩平面的数目
显示卡能够表示的色彩数就是这两个的乘积。iColors = 1 << (iPlanes * iBitsPixel);
在大多数GDI函数呼叫中,使用COLORREF值(只是一个32位的无正负号长整数)来表示一种色彩。 COLORREF值按照红、 绿和蓝色的亮度指定了一种颜色,通常叫做「RGB色彩」。
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | /
((WORD)((BYTE)(g)) << 8)) | /
(((DWORD)(BYTE)(b)) << 16)))
GetNearestColor:决定与某一色彩最接近的纯色。crPureColor = GetNearestColor (hdc, crColor);
设备内容属性:
Windows使用设备内容来保存控制GDI函数在显示器上如何操作的「属性」,所以在用TextOut函数显示文字时,程序写作者不必指定文字的色彩和字体,Windows从设备内容取得这个信息。
保存设备内容:
如果程序需要使用非内定的设备内容属性,则您必须在每次取得设备内容句柄时初始化设备内容。
wndclass.style中加入CS_OWNDC标签,则每个窗口都将拥有自己的设备内容,它一直存在,直到窗口被删除。CS_OWNDC风格只影响GetDC和BeginPaint获得的设备内容。
想改变某些设备内容属性,用改变后的属性进行绘图,然后恢复原来的设备内容。那么应该使用以下两个API
idSaved = SaveDC(hdc);
RestoreDC(hdc, -1);