GDI(Graphics Device Interface)中文可译为“图形设备接口”,是Windows API中相当重要的一个成员,它掌管了所有显像设备的图像显示及输出功能。缺少了它,Windows系统将不会像现在所使用的图形操作环境,而游戏程序既然运行了大量的影像图形处理,自然少不了GDI
1、屏幕区、窗口区与内部窗口区
对于一个游戏程序来说,不论采用全屏幕的模式还是单纯的窗口模式,都必须建立一个窗口。当窗口建立后,显示的屏幕上便划分为3个区域,即屏幕区(Screen)、窗口区(Window)与内部窗口区(Client)。 如下图所示:
屏幕区的区域大小视使用者计算机所设定的显示分辨率而定,一般在程序中都是以像素(pixel)当做坐标及长度单位。800×600即屏幕区矩形的大小即为800×600像素。
2、Device Context
Device Context(设备内容)一般简称为DC,就绘图的观点来说,DC就是程序可以进行绘图的地方。举例来说,如果要在整个屏幕区上绘图,那么Device(设备)就是屏幕,而DC就是屏幕区上的绘图层。相同的道理,如果要在窗口中绘图,那么Device就是窗口,DC就是窗口上可以绘图的地方,也就是内部窗口区。
case WM_PAINT;
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
其中,调用BeginPaint()函数开始进行窗口重绘的动作,而调用EndPaint()函数则是结束所有绘图动作。程序代码中调用BeginPaint()时会返回一个DC对象hdc,此对象所代表的是窗口(hWnd)DC,也就是内部窗口区。当窗口重绘消息发生时,可以在第二行和第三行程序代码之间加入要在内部窗口上进行绘图的动作。
此外,在处理WM_PAINT消息之外的地方,若要取得窗口的DC,必须调用下面的这个函数:
HDC GetDC(HWND hWnd); //取得DC
其中,所输入的参数是窗口的“handle”。handle是Windows系统中用来识别各种不同资源的一个句柄,而且每一项资源的handle都是唯一的。根据handle,Windows可以快速且正确地找到所要使用的资源。注意,若使用GetDC()函数取得窗口DC后,当不使用时必须将它释放,否则其他应用程序将无法使用。
int ReleaseDC(HWND hWnd, HDC释放DC名称); //释放DC
若上面这个函数运行成功,则会返回整数“1”,若失败则返回“0”。
3、坐标系统
坐标问题。以屏幕区的左上角的坐标点为原点,屏幕上的任何一个位置都可以某一点坐标来表示,称为屏幕坐标。若绘图的区域是内部窗口区,那么坐标原点所在的位置就不通了,变成了内部窗口最左上角的点。
4、坐标转换
对于坐标的转换,GDI中提供了相关的函数。
PS:如想获得更多关于Visual C++游戏开发的内容,可点击随笔:《Visual C++游戏编程基础》学习笔记——索引随笔。