第4章,[标签 Win32] :获取设备环境句柄的第一个方法

专栏导航

上一篇:第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 简介与 设备环境

回到目录

下一篇:无

相关推荐
追逐时光者9 小时前
精选 5 款基于 .NET 开源的 Visual Studio 实用插件
visual studio
端平入洛2 天前
delete又未完全delete
c++
祈安_2 天前
C语言内存函数
c语言·后端
端平入洛2 天前
auto有时不auto
c++
埃博拉酱3 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21883 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20213 天前
信号量和信号
linux·c++
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc