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

回到目录

下一篇:无

相关推荐
王老师青少年编程21 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮21 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
样例过了就是过了1 天前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
谭欣辰1 天前
C++ 排列组合完整指南
开发语言·c++·算法
love530love1 天前
精简版|Claude-HUD 插件介绍 + 一键安装教程
人工智能·windows·笔记
代码中介商1 天前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
橙子也要努力变强1 天前
信号捕捉底层机制-机理篇2
linux·服务器·c++
盐焗鹌鹑蛋1 天前
【C++】stack和queue类
c++
秋91 天前
MySQL 8.0.46 全平台安装与配置详解(Windows/Linux/macOS)
linux·windows·mysql
善恶怪客1 天前
LocalSend基本使用
windows