专栏导航
上一篇:第4章,[标签 Win32] :GDI 简介与 设备环境
下一篇:无
本节前言
对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。
我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。
本节内容,来自对佩措尔德教材内容的大段抄录。
一. 获取设备环境句柄的第一个方法
这种方法可以在处理 WM_PRINT 消息时使用。这涉及两个函数,BeginPaint 函数和 EndPaint 函数。这两个函数需要两个参数:一个是窗口的句柄,这是窗口消息处理过程的参数;另一个是类型为 PAINTSTRUCT 结构的变量的地址。PAINTSTRUCT 结构定义在 WinUser.h 头文件中。程序通常将这个变量命名为 ps ,在窗口过程中定义如下:
PAINTSTRUCT ps;
在处理 WM_PRINT 消息时,窗口过程首先调用 BeginPaint 函数。这个函数通常会擦除无效区域的背景以便绘图。它同时还会填充 ps 结构的各个字段。函数的返回值就是设备环境句柄。通常,会将它保存在一个名为 hdc 的变量中。这个变量在窗口过程中定义如下:
HDC hdc;
HDC 数据类型定义为 32 位无符号整数。此后,程序可以调用任何一个需要设备环境句柄的 GDI 函数了,例如 TextOut 。调用一次 EndPaint 函数将释放设备环境句柄。
通常,处理 WM_PRINT 消息的处理代码如下所示。
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
【使用 GDI 函数】
EndPaint(hwnd, &ps);
return 0;
窗口过程在处理 WM_PRINT 消息时必须成对地调用 BeginPaint 和 EndPaint 函数。如果窗口过程不处理 WM_PRINT 消息,WM_PRINT 消息就会被传送给 Windows 默认的窗口过程 DefWindowProc 。在 DefWindowProc 中,WM_PRINT 消息处理的代码如下:
case WM_PAINT:
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
这里除了将原来的无效区域有效化以外,在 BeginPaint 和 EndPaint 之间不包含其他代码。
以下的代码是错误的。
case WM_PAINT:
return 0;
由于部分客户区是无效的,Windows 才会在消息队列中放置一条 WM_PRINT 消息。除非调用 BeginPaint 和 EndPaint,或者 ValidateRect,否则 Windows 不会将那个区域有效化。因此,Windows 将会不停地发送 WM_PRINT 消息,直到永远。这是一种逻辑错误。
二. 注意点
学习 Windows 程序,一个重要的地方就在于,我们需要体会其申请与释放资源的机制。
申请资源,释放资源,这是成对出现的东西。我认为,这是 Windows 程序设计十分有趣的地方。正是这种申请与释放机制,它体现了 Windows 程序的专业性。
希望大家能够成为一个专业的程序员啊。
总 结
以后,我们还会学习获取设备环境句柄的新方法的。
之所以会需要学习获取设备环境句柄的新方法,是因为,此方法,只能在处理 WM_PRINT 消息的时候使用。有时,我们可能需要在其他的消息里获取设备环境句柄,比如在 WM_CREATE 消息里。
至于这个新方法,以后会见到的。而且,本章就可以学到。
本节结束。
专栏导航
上一篇:第4章,[标签 Win32] :GDI 简介与 设备环境
下一篇:无