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 是:
Win32 和 GDI 倾向于保守地创建数据的内部副本,这仅仅是因为在创建它们的大多数 API 时(CreatePatternBrush() 可以追溯到 Windows 95,并且许多函数仍然更旧),内存和 GDI 句柄要多得多供应比现在有限。(例如,Windows 95 需要在只有 4MB RAM 的系统上运行良好。)