本篇将学习绘制线条和填充区域的基本知识,目标是在创建好的窗口上绘制一条线和一个点(蛇与食物),对应《Windows程序设计 第五版》第五章内容。
1.GDI原理
微软Windows子系统负责在称为图形设备接口(Graphics Device Interface,GDI)的视频显示器和打印机上显示图形。
从程序员的角度来说,GDI
由几百个函数以及相关的一些数据类型、宏和结构组成。
在Windows98中,图形显示主要由动态链接库GDI32.DLL
中导出的函数处理。这些动态链接库会调用你安装的视频显示器的设备驱动程序中的一些函数,视频驱动程序会直接访问视频显示器的硬件。
GDI
的一个主要目的就是支持与设备无关的图形。
大多数PC图形输出设备是光栅设备,这也就意味着它们将图像表示成以点
的形式构成的矩阵。
大多数传统的计算机图形程序完全以矢量为主,而图形输出设备使用像素
来表示图形,这意味着(使用矢量图形系统的)程序和硬件之间有着一定程度的隔离。从这个方面看,可以把Windows GDI当成图形设备硬件的一种高层接口,即能把GDI
作为一个高层的矢量绘制系统来使用,也能使用它来进行相对底层的像素操作。
Windows默认使用以像素
点为单位的坐标系统。
GDI
包含几百个函数,可以分为下面几大类:
·获取(或建立)和释放(或销毁)设备环境的函数
·获取设备环境信息的函数
·绘图函数
·设置和获取设备环境属性的函数
·使用GDI“对象”的函数
在屏幕上或打印机上显示的图形类型可以分为下面几个大类,被称为“基本图形”:
·线条和曲线
·可被填充的封闭区域
·位图
·文本
2.点和线的绘制
理论上,所有的图形设备驱动程序所需要的就是SetPixel
函数和GetPixel
函数。其余的一切都可以使用在GDI
模块中实现的更高层的例程来处理。例如,画一条线,GDI
可以不停地调整x
和y
坐标,然后连续调用多次SetPixel
函数来实现。
实际上因为性能(效率)问题,它们并不常用。
SetPixel
函数将坐标为x
和y
的像素点设定为某个特定的颜色:
SetPixel (hdc, x, y, crColor);
GetPixel
函数返回指定坐标位置的像素的颜色:
crColor = GetPixel (hdc, x, y);
crColor
的类型是COLORREF
,用来指定颜色。
Windows可以绘制直线、椭圆弧线(椭圆圆周上的曲线)和贝塞尔样条曲线。
Windows 98支持7种画线函数:
LineTo, 画直线
Polyline 和 PolylineTo, 画一条由多条首尾相连的直线构成的折线
PolyPolyline, 画多条折线
Arc, 画椭圆弧线
PolyBezier 和 PolyBezierTo,画贝塞尔样条曲线
一些既完成画线也会填充所画图形封闭区域的函数:
Rectangle, 画矩形
Ellipse, 画椭圆
RoundRect, 画圆角矩形
Pie, 画椭圆的一部分,使其看起来像一个扇形
Chord, 画出由弦分割出的部分椭圆,形状呈弓形
为了画一条线,必须调用两个函数。第一个函数用来指定直线的起点,第二个函数用来指定直线的终点:
MoveToEx(hdc, xBeg, yBeg, NULL);
LineTo(hdc, xEnd, yEnd);
画矩形:
Rectangle(hdc, xLeft, yTop, xRight, yBottom);
调用上面的任何一个画线函数时,Windows都会使用当前选入设备环境的“画笔”来绘制直线。画笔决定了线条的颜色、宽度和样式。画笔的默认设备环境是BLACK_PEN
。该画笔会绘制一条实心的宽度为1个像素的黑色线条。
通过CreatePen
函数创建画笔:
HPEN hPen;
hPen = CreatePen(iPenStyle, iWidth, crColor);
将画笔选入当前设备环境:
SelectObject(hdc, hPen);
删除画笔:
DeleteObject(hPen);
下面代码为使用红色画笔画一条宽度为10个像素的直线:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
char* text = "START GAME";
TextOut(hdc, 500, 300, text, 10);
HPEN hPen;
hPen = CreatePen(PS_SOLID, 10, RGB(255,0,0));
SelectObject(hdc, hPen);
MoveToEx(hdc, 500, 250, NULL);
LineTo(hdc, 580, 250);
EndPaint(hwnd, &ps);
DeleteObject(hPen);
return 0;
用下面命令编译:
gcc snake.c -o snake.exe D:\MinGW\lib\libgdi32.a
运行结果如下:
贪吃蛇
知道了画线和矩形的方法,就可以创建“蛇”和“食物”了,下一篇学习“绘制填充区域”等第五章剩余内容。后面还要学习有关键盘、鼠标和计时器的三章内容,然后应该就可以完整的做完这个贪吃蛇游戏了。本书之后的第9~23章内容当作参考资料,不再详细学习。好了,今天就学到这里,下次继续。
网友评论