题
MSDN 显示 CreatePatternBrush 的以下内容:
您可以使用DeleteObject函数删除模式刷,而不会影响关联的位图。因此,您可以使用此位图来创建任意数量的模式刷。
我的问题恰恰相反。如果 HBRUSH 寿命较长,我可以在创建画笔后立即删除 HBITMAP 吗?IE:HBRUSH 是否存储自己的 HBITMAP 副本?
在这种情况下,我希望 HBRUSH 具有对象范围,而 HBITMAP 具有方法范围(创建 HBRUSH 的方法)。
解决方案
HBRUSH 和 HBITMAP 是完全独立的。句柄可以完全独立地删除,并且一旦创建,对任何一个对象的更改都不会影响另一个对象。
其他提示
画笔确实有自己的位图副本。通过在创建画笔后删除位图然后使用画笔可以很容易地看到这一点(效果很好)
但不幸的是,使用 GetObject 填充 LOGBRUSH 结构将返回成员 lbhatch 中的原始 BITMAP 句柄,而不是副本的句柄。如果删除位图,则在返回的位图句柄上使用 GetObject 将失败。
在这种情况下,任何人都知道如何从画笔获取原始位图尺寸?我希望创建图案画笔的副本,即使原始位图已删除。我只需用画笔绘画即可获得原始位图的副本,但我不知道它的大小。我尝试使用 SetbrushorgEx (hdc, -1,-1),希望当将画笔选择到设备上下文中时,-1 会以其尺寸为模减小,并在使用 GetBrushOrgEx 检索时获取值。不起作用。
我认为位图必须比画笔更长寿:画笔仅引用现有位图而不是复制它。
你总是可以尝试一下,看看会发生什么。
我怀疑 CreatePatternBrush() API 是否会复制您提供的位图,因为 HBITMAP 是:
- GDI 句柄,其最大数量受到限制,以及
- 可能相当大。
Win32 和 GDI 在创建数据的内部副本方面往往比较保守,因为在创建它们的大多数 API 时(CreatePatternBrush() 可以追溯到 Windows 95,并且许多函数还更旧),内存和 GDI 句柄占用的空间要大得多。供应比现在有限。(例如,Windows 95 需要在只有 4MB RAM 的系统上良好运行。)