第5章,[Win32 章节] :绘图模式

专栏导航

上一篇:第5章,Win32 章节 :填充空隙

回到目录

下一篇:第5章,Win32 章节 :绘制填充区域

本节前言

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

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

本节所讲解的绘图模式,它涉及了较多的位运算。关于位运算,我们在之前的预备章节中是有讲解过的。

在我写作本节时,我在下面的截图所示的章节中,是有讲过的。
图1

图1 所示的几个位运算课节,我再将它们的链接贴在下面。

参考课节:编程基础:位运算01,位运算引言

参考课节:编程基础:位运算02,按位取反

参考课节:编程基础:位运算03,按位与运算

参考课节:编程基础:位运算04,按位或运算

参考课节:编程基础:位运算05,按位异或运算

参考课节:编程基础:位运算06,左移

参考课节:编程基础:位运算07,右移

如果呢,你对位运算不熟悉,可以参照上面的课节来学习。当然了,你也可以购买专门的 C/C++ 教材,来复习相关的知识。

我们开始本节的讲解。

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

一. 本节内容

显示器上所显示的线条外观也受定义在设备环境中的绘图模式的影响。设想画一条直线,其颜色由画笔的颜色和画线显示区域的颜色共同决定。你能够使用同一支画笔在白色表面上绘制出黑色的线条,在黑色的表面上绘制出白色的线条,同時不必知道表面的确切的颜色。这样对你有用吗?通过设定绘图模式,这些功能都是可以做到的。

当 Windows 使用一个画笔绘制直线时,它实际上是在将画笔的像素颜色和目标显示表面的像素颜色按位进行布尔运算。对像素颜色执行一个按位布尔运算称为 "光栅操作"(raster operation,ROP),简称 "ROP" 。因为绘制一条直线只涉及两种像素颜色(即画笔和目标),这里的布尔运算就被称为 "二元光栅操作",或者 "ROP2" 。Windows 定义了 16 种 ROP2 运算码,每一个都表示 Windows 组合画笔像素色和目标像素色的一种方式。

在默认的设备环境中,绘图模式是 R2_COPYPEN,意思是 Windows 只是简单地将画笔像素的颜色复制到目标像素上,这也是我们通常所熟知的。还有 15 种其他 ROP2 代码。

16 种不同的 ROP2 运算码是怎样得来的呢?为了做一个示范,我们假设每个像素使用 1 位的单色系统。目标颜色(窗口客户区的颜色)可以是黑色(用 0 表示)或者白色(用 1 表示),画笔也可以是黑色或白色。这样,使用黑色或白色画笔在黑色或白色目标上画图就有四种组合:白色画笔与白色目标,白色画笔与黑色目标,黑色画笔与白色目标,黑色画笔与黑色目标。

画笔在目标上绘制后会得到什么颜色呢?一种可能是画出的线总是黑色,不管画笔和目标的颜色如何,这种绘图方式由 ROP2 运算码中的 R2_BLACK 表示。

另一种可能是只有当画笔颜色与目标颜色都是黑色时,绘制的线才是白色,其他情况下绘制的线都是黑色。尽管这有些奇怪,但是 Windows 还是为这种绘图方式起了一个名字,称为 R2_NOTMERGEPEN 。Windows 把目标像素与画笔像素进行一个 "位或" 运算,然后将结果取反得到颜色。

下表显示了所有 16 种 ROP2 绘图模式,表中指出了画笔颜色(P)和目标颜色(D)是如何组合形成最终颜色的。在 "布尔操作" 一栏,我们使用 C 语言的位运算符显示目标像素与画笔像素的组合方式。
图2,绘图模式

可以通过调用下面的函数设置一种新的绘图模式。

复制代码
SetROP2 (hdc, iDrawMode);

参数 iDrawMode 是上表中 "绘图模式" 栏中给出的值。可以使用下面的函数来获取当前绘图模式。

复制代码
iDrawMode = GetROP2 (hdc);

设备环境默认使用 R2_COPYPEN 模式,它简单地用画笔颜色替代目标颜色。在 R2_NOTCOPYPEN 绘图模式下,若画笔为黑色,则绘制成白色;若画笔为白色,则绘制成黑色。

在 R2_BLACK 绘图模式下,不管画笔或者背景的颜色,Windows 总是绘制黑色。相反,在 R2_WHITE 绘图模式下,则总是绘制成白色。

R2_NOP 表示 "不操作",它让目标颜色保持不变。

我们已经讨论了单色系统的绘图模式。然而,大多数系统都是彩色的。在彩色系统中,Windows 为画笔和目标像素的每个颜色位执行绘图模式的位运算。也是使用上表中描述的 16 种 ROP2 代码。

R2_NOT 绘图模式总是将目标颜色取反来确定绘制的线的颜色,而不管画笔的颜色。例如,在颜色为 cyan(一种青色)的目标上用 R2_NOT 模式画的线总是 merganta(一种紫红色)。

除了中等灰度的背景上,在 R2_NOT 模式下画出的图形和背景颜色差别通常较大,总可以被清晰地辨认出来。我们将在以后的章节中,通过 BlokOut 程序来演示 R2_NOT 绘图模式的用法。

结束语

不知道,本节内容,你学习起来,感觉咋样。

本节结束。

专栏导航

上一篇:第5章,Win32 章节 :填充空隙

回到目录

下一篇:第5章,Win32 章节 :绘制填充区域

相关推荐
INGNIGHT27 分钟前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
小小杨树1 小时前
【C++】学习:双缓冲视频流水线深解析
c++·性能优化·音视频开发
青少儿编程课堂2 小时前
图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播
c++·python·算法·bfs·信息学竞赛
赵民勇2 小时前
C++无锁编程详解
c++
醉颜凉2 小时前
C++ 中野指针与悬挂指针的区别:从成因到防范,彻底讲清两种危险指针
c++
Demon--hx2 小时前
设计不能被继承的类
开发语言·c++
兔兔兔兔13 小时前
记录C++ 13
开发语言·c++·算法
码行山野赴时序归途3 小时前
从暴力到最优:三道 C 语言入门题的解法思路
c语言·开发语言·数据结构·算法·leetcode·排序算法
sunoo-2293 小时前
【Linux 系统编程】学习第七天:线程属性 | 互斥锁 | 死锁 | 信号量 核心知识点 + 踩坑实战
linux·c语言·笔记·vscode·学习