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

回到目录

下一篇:无

相关推荐
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧7 小时前
C++学习:基础知识的掌握
c++·visualstudio
wuyk5558 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
江畔柳前堤9 小时前
HBM:大语言模型时代的「算力血液」——从内存墙到带宽革命的深度拆解
服务器·人工智能·windows·目标检测·语言模型·自然语言处理·软件工程
C++ 老炮儿的技术栈13 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
天天进步201513 小时前
UI-TARS 源码解析 #22:二次开发实战:用 UI-TARS 做一个简单的 Windows 自动操作 Agent
windows·ui
啊哈一半醒14 小时前
Windows 虚拟机搭建 CentOS 全过程(2026 最新版 + 踩坑解决)
linux·windows·centos
new_zhou14 小时前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
水饺编程15 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh15 小时前
类和对象~
开发语言·c++
程序喵大人15 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法