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 是:

  1. GDI 句柄,其最大数量受到限制,以及
  2. 可能相当大。

Win32 和 GDI 在创建数据的内部副本方面往往比较保守,因为在创建它们的大多数 API 时(CreatePatternBrush() 可以追溯到 Windows 95,并且许多函数还更旧),内存和 GDI 句柄占用的空间要大得多。供应比现在有限。(例如,Windows 95 需要在只有 4MB RAM 的系统上良好运行。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top