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

回到目录

下一篇:无

相关推荐
汉克老师12 分钟前
GESP5级C++考试语法知识(七、链表(二)双链表)
c++·链表·双链表·gesp5级·gesp五级
旖-旎12 分钟前
二分查找(寻找旋转排序数组中的最小值)(7)
c++·算法·二分查找·力扣
C羊驼13 分钟前
C/C++数据结构与算法:穷举法
c语言·c++·笔记·学习·算法
十五年专注C++开发17 分钟前
libuv:一个跨平台的C++异步 I/O 库
开发语言·c++·node.js·libuv·vlibuv
程序员敲代码吗21 分钟前
USB-C接口深度测试:从Vconn到电压的全方位分析
c语言·开发语言
武藤一雄30 分钟前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
qq_417695051 小时前
C++中的解释器模式
开发语言·c++·算法
Hello eveybody1 小时前
C语言的发明者介绍
c语言
xiaoye-duck1 小时前
《算法题讲解指南:动态规划算法--路径问题》--9.最小路径和,10.地下城游戏
c++·算法·动态规划
刺客xs1 小时前
c++模板
java·开发语言·c++