这一篇的目标是实现在上一篇创建的窗口中添加一些文本。对应《Windows程序设计》第四章。
1.绘制和重绘的概念
一些情况下,Windows需要程序重新绘制窗口客户区(比如窗口被其它窗口遮住一部分,当其它窗口被移开时)。这时Windows通过向适当的窗口过程发送WM_PAINT
消息,来通知窗口过程其客户区需要重绘
。
需要重新绘制的部分被称为“无效区域”或“更新区域”,Windows内部为每一个窗口都保存了一个“绘制信息结构
”,这个结构保存着一个可以覆盖该无效区域的最小矩形的坐标和一些其他的信息,这个最小矩形被称为“无效矩形
”。
窗口过程在处理WM_PAINT
消息时,在调用BeginPaint
函数后,整个客户区会变成有效的。
绘制信息结构:
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;
当调用BeginPaint
函数时,Windows将自动填充这个结构中的字段。程序只能够使用前三个字段,其它的供Windows内部使用。hdc
字段是设备环境句柄,BeginPaint
函数的返回值就是它的值。
2.GDI简介
GDI
是Windows的图形设备接口。就是用它来绘制窗口的客户区。
Windows提供了几个GDI
函数用于在客户区内输出字符串,其中最常用的是TextOut
函数。该函数格式如下:
TextOut (hdc, x, y, psText, iLength);
参数psText
是指向字符串的指针,参数iLength
是字符串的长度,参数x
和y
定义了字符串在客户区中的开始位置,参数hdc
是一个设备环境句柄(Handle Device Context)。几乎所有的GDI
函数都需要这个句柄作为函数的第一个参数。
设备环境(DC)是GDI
内部维护的一个数据结构。对于视频显示,设备环境通常与屏幕上的一个特定窗口相关联。
Windows应用程序需要在屏幕上绘图时,通常有两种方法获取设备环境句柄。方法一是处理WM_PAINT
消息时使用BeginPaint
函数的返回值。通常处理代码如下:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
[使用GDI函数]
EndPaint(hwnd, &ps);
return 0;
参数hwnd
是窗口句柄。参数&ps
是PAINTSTRUCT
结构变量的地址,通常在窗口过程中定义如下:
PAINTSTRUCT ps;
获取设备环境句柄的方法二,是使用GetDC
函数。在使用完之后,调用ReleaseDC
函数释放设备环境句柄:
hdc = GetDC(hwnd);
[使用GDI函数]
ReleaseDC(hwnd, hdc);
3.TEXTOUT函数使用
基于以上内容,将上一篇中的代码改变如下:
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
char* text = "START GAME";
TextOut(hdc, 500, 300, text, 10);
EndPaint(hwnd, &ps);
return 0;
重新编译并手动连接使用TextOut
函数需要用到的libgdi32.a库:
gcc hellowin.c -o hellowin.exe D:/MinGW/lib/libgdi32.a
得到.exe可执行文件,执行结果如下:
界面
好了,第四章的内容就看到这里,下一篇开始学习第五章。
网友评论