我正在浏览 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
的,至少大约是这样?
让我们解决这些问题:
但对我来说真正困惑的主要点是:
将描述为整数的颜色投射到 HBRUSH 从而使其成为结果指针的地址有什么意义?
Brush的RGB颜色存储在哪里?
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
而且,不用说,当您创建画笔时,它会添加到表格中,当您销毁它时,它会被删除。欢迎提问,请在评论中提出。