[学习笔记] Windows编程——GDI——(二)画刷

前言:

学习笔记,随时更新。如有谬误,欢迎指正。

说明:

红色字体为较为重要部分。绿色字体为个人理解部分。

原文链接:https://learn.microsoft.com/en-us/windows/win32/gdi/brushes

2 画刷

画刷是一种图形工具,应用程序使用它来绘制(填充)多边形、椭圆和路径的内部。

2.1 关于画刷

画刷有两种类型:

逻辑画刷:应用程序用于绘制形状的理想位图的描述。物理画刷:设备驱动程序根据应用程序的逻辑画刷定义创建的实际位图。 当应用程序调用某创建画刷的函数时,它将产生逻辑画刷的句柄。当应用程序将此句柄传递给 SelectObject 函数时,相应输出设备的驱动程序将创建物理画刷。

2.1.1 画刷原点

当应用程序调用绘制函数绘制形状时,系统将画刷定位在绘制操作的开始位置,并将画刷位图中的一个像素映射到窗口原点的客户区,即窗口的左上角。系统映射的像素的坐标称为画刷原点。默认的画刷原点位于画刷位图的左上角,坐标( 0, 0 )。然后系统在客户端区域复制画刷,形成与位图一样高的图案。复制操作一行一行地继续,直到整个客户端区域被填满(画刷图案仅在指定形状的边界内可见)。

在某些情况下,不应使用默认画刷原点。可以通过调用 SetBrushOrgEx 函数来重置画刷原点。还可以通过调用 GetBrushOrgEx 来查询当前画刷原点。

2.1.2 逻辑画刷类型

有四种类型的逻辑画刷:纯色画刷、预设(常备)画刷、阴影画刷、图案(自定义)画刷。

预设(常备)画刷和阴影画刷有很多与定义好的样式可选。

通过 CreateBrushIndirect 函数可以创建具有指定样式、颜色和图案的逻辑画刷。

2.1.2.1 纯色画刷

纯色画刷是包含 64 个相同颜色像素的逻辑画刷。

应用程序可以通过调用 CreateSolidBrush 函数创建纯色逻辑画刷,并指定所需的画刷颜色。

2.1.2.1 预设(常备)画刷

GDI 维护了 7 个预定义的逻辑预设画刷。可通过 GetStockObject 来获取相应画刷句柄。

还有 21 预定义的逻辑预设画刷由窗口管理界面维护。它们对应于菜单、滚动条和按钮等窗口元素的颜色。可通过 GetSysColorBrush 来获取相应画刷句柄。应用程序可以通过 GetSysColor/SetSysColors 来查询/设置界面元素的颜色。

2.1.2.1 阴影画刷

GDI 维护有 6 个预定义的逻辑阴影画刷。

通过调用 CreateHatchBrush 函数(指定六种阴影样式之一)来创建阴影画刷。

2.1.2.1 图案(自定义)画刷

若要创建图案画刷,应用程序必须首先创建位图。创建位图后,通过调用 CreatePatternBrush 或 CreateDIBPatternBrushPt 函数来创建图案画刷。

2.1.3 图案块传输

PatBlt 函数( pattern block transfer 的缩写)复制画刷(或图案),直到填充指定的矩形。然而,这个函数实际上要强大得多。在复制画刷之前,它通过光栅操作( ROP )将图案的颜色数据与视频显示器上现有像素的颜色数据结合起来。有 256 个 ROP ,但 PatBlt 函数只识别那些需要一个图案和一个目标的(不识别那些需要一个源的)。下表列出了最常见的 ROP 。

ROP描述PATCOPY将图案复制到目标位图。PATINVERT使用布尔 XOR 运算符将目标位图与图案混合。DSTINVERT反转目标位图。BLACKNESS将所有输出转换为二进制 0 。WHITENESS将所有输出转换为二进制 1 。 有关详细信息,请参阅光栅操作码。

2.1.4 已启用 ICM 的画刷函数

尽管设备之间的成像技术和色彩功能存在差异, Microsoft 的图像颜色管理( Image Color Management, ICM )也能确保彩色图像、图形对象或文本对象在任何设备上的呈现尽可能接近其原始意图。在任何设备上, ICM 2.0 都有助于保持颜色的一致性和准确性。有关 ICM 的详细信息,请参阅 Windows 颜色系统。

以下画刷函数启用了对 ICM 的支持: CreateBrushIndirect 、 CreateDIBPatternBrush 、 CreateDIBPatternBrushPt 、 CreateHatchBrush 、 CreatePatternBrush 、 CreateSolidBrush 。

2.2 使用画刷

有关详细信息,请参阅使用画刷。

2.3 画刷参考

2.3.1 画刷函数

有关详细信息,请参阅画刷函数。

2.3.1 画刷结构体

有关详细信息,请参阅画刷结构体。

笔记本电脑的电池能用多久
[Java基础]对象的生命周期