windows中,图形显示主要由动态库 GDI32.DLL中导出的函数处理。
工作原理: GDI32.DLL中的函数 调用显示器和打印机的设备驱动程序 来绘制图形,即GDI32.DLL间接利用驱动程序来完成工作。
图形输出设备:
图形输出设备分为两类:
<1>光栅设备: raster device : 是将图像表示成以点的形式构成的矩阵, 即以点构图。
<2>矢量设备: vector device. :使用线条来绘制图像, 矢量设备通常指绘图机。
windows默认使用以像素为单位的坐标系统。 但windows GDI允许使用任何一种坐标系统(可以使用其他依据物理测量得到的坐标系统), 所以你可以使用虚拟坐标系统来保证程序与硬件独立,也可以使用设备坐标系统来完全迎合硬件的需求。(暂时还不知道这段话的意思,以及如何改变Windows使用的坐标系统,以及何种情况下会使用到其他坐标系统)
以像素的形式进行程序设计时,意味着放弃了设备独立性,这不完全正确。 关键在于要以设备独立的方式来使用像素,这需要设备接口语言为程序提供一种机制来查询设备的硬件特性,以便程序作出合适的调整。
总体来说GDI只是一个静态显示系统,对动画的支持很有限。如果需要为游戏编写复杂的动画,应当学习一下DirectX,它提供了必要的动画支持。
GDI函数分类 : GDI包含几百个函数,可以分为为以下几类:
<1>获取(或建立)和释放(或销毁)设备环境函数
<2>获取设备环境信息的函数
<3>绘图函数
<4>设置和获取设备环境属性的函数
<5>使用GDI 对象的函数,(GDI对象指 画笔,花刷等)
GDI的基本图形: (在屏幕或打印机上显示的图形类型可以分为下面几类,被称为基本图形)
<1>线条和曲线
<2>可被填充的封闭区域
<3>位图, 是一个二维数组,每个元素都对应显示设备上的一个像素。 位图是光栅图形的基础。
<4>文本,
GDI其他部分:
<1>映射模式(mapping mode ) 和转换(transform):
映射模式:默认情况下,是以像素为单位进行绘制的,但GDI允许以英寸,毫米等其他任何单位进行绘制。
转换: Windows NT支持传统的3x3 矩阵表示的世界坐标转换(world transform), 这用于倾斜和旋转图形对象。
<2>图元文件(metafile) : metafile是一个以二进制形式存储的GDI命令集合,主要用于通过剪贴板转换矢量图形绘制的表现形式。
<3>区域(region): 是一个任意形状的封闭图形, 通常可以表示为有一系列简单区域进行布尔运算后得到的结果。可以利用区域进行轮廓绘制,填充或者剪裁。
<4>路径(path), 是存储在GDI内部的直线和曲线的集合。 可以用于绘制,填充,和剪裁。 路径还可转换为区域。
<5>剪裁(clipping) , 当绘图被限制在客户区的一个特定空间位置时,就发生了剪裁。 那个特定空间位置可以是矩形或非矩形,它通常被制定为一个区域或者一个路径。
<6>调色板(palettes)
<7>打印(printing)
设备环境
如果希望在图形输出设备(如屏幕或者打印机) 上绘制图形, 必须首先获取设备环境(device context , DC)的句柄。 设备环境句柄是与设备相关联的, 当使用设备句柄传递给GDI函数绘图时,也就告诉了Windows在哪个设备上进行绘图。
获取设备环境句柄的几种方式:
一 ,在处理WM_PAINT消息时,获得设备环境句柄,绘图,然后释放设备环境句柄:
HDC hdc = BeginPaint(hwnd,&ps); //获取窗口客户区中pc结构体中rcPaint结构体指定的区域的设备环境句柄 EndPaint(hwnd,&ps); //释放设备环境句柄
二, 在处理非WM_PAINT消息时:
HDC hdc = GetDC(hwnd); //获取整个窗口客户区的设备环境句柄 ReleaseDC(hwnd,hdc); //释放设备环境句柄
BeginPaint()函数获取的是 传递的窗口句柄 hwnd 所对应的窗口的客户区的设备环境句柄, 并且 ps 结构中包含一个rcPaint的矩形结构体,这个矩形定义了一个包围窗口客户区无效范围的矩形, 使用从BeginPaint函数获取的设备环境句柄,就只能在这个矩形区域内绘图, 调用 BeginPaint函数将使这个区域有效。
GetDC() 函数获得的是 hwnd对应窗口的整个客户区 设备环境句柄。 GetDC() 和 ReleaseDC()函数并不使任何客户区的无效区域变为有效。
三, 获得整个窗口的设备环境句柄, 其包括窗口标题拦,菜单,滚动条 和 客户区的外框。
HDC hdc = GetWindowDC(hwnd); //获取整个窗口的设备环境句柄 ReleaseDC(hwnd, hdc); //释放窗口的设备环境聚丙
四,更通用的获取设备环境句柄
HDC hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData); //获取设备环境句柄 DeleteDC(hdc); //释放设备环境句柄
五,处理位图时,有时可能会用到一个 “内存设备环境”:
HDC hdcMem = CreateCompatibleDC(hdc); //获得内存设备环境句柄 DeleteDC(hdcMem); //释放设备环境句柄
可以把一个位图选入内存设备环境,并且调用GDI函数绘制这个位图。
六,获得一个图元文件的设备环境句柄:
HDC hdcMeta = CreateMetaFile(pszFilename); //获得图元文件的设备环境句柄 CloseMetaFile(hdcMeta); //释放图元文件的设备环境句柄
获取设备环境的信息
设备环境通常指的是物理的显示设备。 调用 GetDeviceCaps()函数来获取:
int iValue = GetDeviceCaps(hdc, iIndex);
iIndex参数,是定义在WINGDI.H头文件中的29个标识符之一。 例如, 当iIndex的值为 HORZRES 时,GetDeviceCaps()函数 以像素为单位返回设备的宽度;
设备的尺寸
如果你想绘制一个变长为 1 英寸的正方形。 为了完成这个正方形,或者你(程序员)或者 Windows(操作系统)需要知道在视频显示器上的 1 英寸对应的像素数目。 GetDeviceCaps函数可以帮助获得有关输出设备的物理尺寸信息。
色彩
对于只显示黑色和白色的显示器,要显示每个像素只需要 1 bit 的内存。
真彩(full color)显示器每像素由 24 bit (8bit表示红色,8bit表示绿色,8bit表示蓝色)内存存储。 一个能显示256色的视频适配器每像素需要8位的内存来表示。
设备环境属性
Windows在设备环境中存储着一些属性,这些属性控制GDI函数在显示器上的操作方式。 当一个程序获取一个设备环境句柄时,Windows会设置所有的属性的默认值。
保存设备环境
一般,掉哟概念GetDC 或者 BeginPaint 函数时, Windows返回一个设备环境,它的所有属性都被设定为默认值,当设备环境调用ReleaseDC 或者 EndPaint函数时,对属性所做的任何改变都会丢失。
若要保存设备环境,可以在注册窗口类时, 使用 CS_OWNDC 样式, 这样设备环境属性在下一次改变前会一直有效。