news 2026/8/27 9:00:46

第5章,[Win32 章节] :使用现有画笔

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第5章,[Win32 章节] :使用现有画笔

专栏导航

上一篇:第5章,[Win32 章节] :贝塞尔样条曲线(二)

回到目录

下一篇:第5章,[Win32 章节] :创建、选择和删除画笔

本节前言

对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。

我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。

本节,我们要来讲画笔了。它是一个很有趣的 GDI 对象。

以后,我们还要去学习 GDI 画刷、GDI 位图、GDI 字体等等的东西。

对于GDI 对象,它的有趣的一点是,你可以使用系统备用的对象,如果不使用系统备用的对象,那么,你需要手动去创建它。无论是使用备用对象还是手动创建,你都需要将其选入设备环境,已选入设备环境的 GDI 对象才能够在绘图中使用它。当你用完了相应的 GDI 对象以后,你还需要将它选出设备环境。然后呢,如果选出的 GDI 对象是系统备用的对象,那你的工作就结束了。如果选出的 GDI 对象是你自己手动创建的,那么,你还需要将其删除掉,然后你的工作才算是结束。

在这里呢,我们将创建 GDI 对象的步骤简称为创建,将把 GDI 对象选入设备环境的步骤简称为选入,将把 GDI 对象选出设备环境的步骤简称为选出,最后,将删除 GDI 对象的步骤简称为删除。这种创建、选入、使用 GDI 对象、选出、删除的流程,我觉得是非常专业和有趣的。

我在学习 GDI 的各种对象的时候,我就非常喜欢这么一套流程。我在这种使用流程之中,感受到了 Windows 的专业与强大。

本节,我们算是初次接触一个 GDI 对象的使用流程中的一个,使用现有画笔,也就是使用系统备用的 GDI 画笔。其余的步骤,我们以后会讲。

本节内容,来自于对佩措尔德教材的大段抄录。

一. 本节内容

调用本节介绍的任何一个画线函数时,Windows 都会使用当前选入设备环境的 “画笔” 来绘制直线。画笔决定了线条的颜色、宽度和样式,样式可以是实线、点线或者虚线。

画笔的默认设备环境是 BLACK_PEN 。该画笔会绘制一条实心的、宽度为 1 个像素的黑色线条。BLACK_PEN 是 Windows 提供的三种 “备用画笔”(stock pen)中的一种。另外两种分别是 WHITE_PEN 和 NULL_PEN 。NULL_PEN 表示不会只任何图形的画笔,这个画笔是很有用的。你也可以创建自己的画笔。但是,本节我们不讲如何创建自定义画笔,我们只讲如何使用系统备用的画笔。

在 Windows 程序中,使用句柄来操作画笔。 Windows 头文件 WinDef.h 定义画笔句柄的类型为 HPEN 。可以使用这个类型定义一个变量。例如 hPen 。

HPEN hPen;

调用 GetStochObject 函数可以获取备用画笔的句柄。例如想使用名为 WHITE_PEN 的备用画笔。可以按照如下方式获取画笔句柄。

hPen = GetStockObject (WHITE_PEN);

现在,我们需要把这个画笔选入设备环境。

SelectObject (hdc, hPen);

现在,当前画笔变成白色画笔。也就是说,在该函数调用之后,绘制的所有线条都将使用 WHITE_PEN ,直到将另一种画笔选入设备环境或者你释放了设备环境句柄。

除了明确地定义 hPen 变量,还可以将 GetStockObject 调用和 SelectObject 调用组合在一条语句中。

SelectObject (hdc, GetStockObject (WHITE_PEN));

接着,如果想恢复使用 BLACK_PEN,也可以只使用一条语句来获取那个备用对象 BLACK_PEN 的句柄,同时将它选入设备环境。

SelectObject (hdc, GetStockObject (BLACK_PEN));

SelectObject 函数返回一个先前选入设备环境的画笔的句柄。如果使用一个新的设备环境,并且书写了下面的代码。

hPen = SelectObject (hdc, GetStockObject (WHITE_PEN));

那么,设备环境中的当前画笔就变为 WHITE_PEN,变量 hPen 将是 BLACK_PEN 画笔的句柄。可以接着通过下面的调用将 BLACK_PEN 重新选入设备环境。

SelectObject (hdc, hPen);

我们推荐应用下面的框架,来使用 GDI 备用画笔。

HPEN hPen; hPen = SelectObject (hdc, GetStockObject (某种备用画笔标识)); /****** 使用画笔来绘图的代码的起始 *******/ ................ [使用画笔来绘图] [使用画笔来绘图] [使用画笔来绘图] ................ /****** 使用画笔来绘图的代码的结束 *******/ SelectObject (hdc, hPen);

上述伪代码,我相信你能够看懂它。

结束语

本节内容,应该是不难理解的。

在结尾部分的代码框架,这是我自己加上的。

学习愉快啊。

本节结束。

专栏导航

上一篇:第5章,[Win32 章节] :贝塞尔样条曲线(二)

回到目录

下一篇:第5章,[Win32 章节] :创建、选择和删除画笔

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 8:54:20

Keyviz 键鼠可视化:3 步让每个快捷键都清晰可见

Keyviz 键鼠可视化:3 步让每个快捷键都清晰可见 【免费下载链接】keyviz Keyviz is a free and open-source tool to visualize your keystrokes ⌨️ and 🖱️ mouse actions in real-time. 项目地址: https://gitcode.com/gh_mirrors/ke/keyviz …

作者头像 李华
网站建设 2026/8/27 8:49:16

蓝桥杯ALGO-478分数序列:从浮点精度陷阱到高精度计算实战

1. 问题引入:从一道“简单”的数列题说起 最近在整理蓝桥杯的历年算法训练题时,又翻到了ALGO-478这道“分数序列”。题目本身描述很简单:有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13... 求出这个数列的前N项之和。相信很多刚接…

作者头像 李华
网站建设 2026/8/27 8:46:40

Python与TensorFlow实战:从零构建手写数字识别模型

简介:机器学习作为人工智能的核心技术,其核心原理是通过算法让计算机从数据中学习规律。在图像识别领域,卷积神经网络(CNN)因其能够自动提取局部特征的特性,成为处理视觉任务的主流架构。这项技术的价值在于…

作者头像 李华
网站建设 2026/8/27 8:44:25

AI时代,数据架构师还有没有护城河?

先说一个不太好听的判断有一部分数据架构师,护城河已经在消失了。不是因为他们能力不行。是因为他们的护城河,从一开始就建在了一个会被AI率先填平的地方——技术门槛。会写复杂SQL,懂数仓分层建模,能设计ETL流程,熟悉…

作者头像 李华