Win32 GDI 画笔对象

问题描述 投票:0回答:1

我正在浏览 Microsoft 的“Win32 入门”系列文章,在不远处我偶然发现了这一行

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

据我了解,

(HBRUSH) (COLOR_WINDOW+1)
强制转换本质上使
COLOR_WINDOW+1
地址存储在结果
HBRUSH
指针中,我不太明白它想要实现什么。进一步,我查看了
HBRUSH
结构体是如何在
windef.h
标头中定义的,这是一个导致此定义的宏:

struct HBRUSH__{int unused;}; typedef struct HBRUSH__ *HBRUSH

还有许多其他结构体以相同的方式定义。下一步是检查什么函数(例如

CreateSolidBrush(RGB(100,100,100))
)返回并通过 Visual Studio 调试器检查该结构中存储的内容。该函数的结果是一个指向结构体的指针,其中
int unused
字段未使用。那么,拥有一个包含上面定义的未使用字段的结构有什么意义呢?如果我不得不猜测这是一种统一的方式,一种保护将一个结构转换为另一个结构的方法,但未使用的字段对我来说仍然没有意义。

但真正令我困惑的主要点是:将

color
描述为
integer
转换为
HBRUSH
从而使其成为结果指针的地址,有什么意义? Brush的RGB颜色存储在哪里?我猜想
HBRUSH
等函数在内部是如何处理
FillRect()
CreateSolibBrush
的,至少大约是这样?

c++ c windows winapi gdi
1个回答
0
投票

让我们解决这些问题:

但对我来说真正困惑的主要点是:

  1. 将描述为整数的颜色投射到 HBRUSH 从而使其成为结果指针的地址有什么意义?

  2. Brush的RGB颜色存储在哪里?

  3. FillRect() 和 CreateSolidBrush 等函数在内部如何处理 HBRUSH(至少大约是这样)?

所以:

#1 提供了一种使用系统颜色进行绘制的便捷方法,而无需创建自己的画笔。它也很高效,因为您不需要为此创建画笔的开销。

#2 在 GDI 内的某种表中。最终,除了 #1 涵盖的特殊情况之外,

HBRUSH
充当所述表的索引,这就是存储 RGB 值的位置。还有图案画笔,可以是任意大小,并且这些信息都不适合
HBRUSH
结构本身。正如 @igor 指出的那样,这只是为了类型安全。

#3:(伪代码)

if (brush value is small)
    assume it's one of the predefined SYSCOLOR brushes
else
    look it up in the table of brushes stored inside GDI and do funky stuff

而且,不用说,当您创建画笔时,它会添加到表格中,当您销毁它时,它会被删除。欢迎提问,请在评论中提出。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.