4

MSDN 为 CreatePatternBrush 显示以下内容:

您可以使用 DeleteObject 函数删除图案画笔而不影响关联的位图。因此,您可以使用此位图创建任意数量的图案画笔。

我的问题是相反的。如果 HBRUSH 长期存在,我可以在创建画笔后立即删除 HBITMAP 吗?IE:HBRUSH 是否存储自己的 HBITMAP 副本?

在这种情况下,我希望 HBRUSH 具有对象范围,而 HBITMAP 将具有方法范围(创建 HBRUSH 的方法)。

4

4 回答 4

5

HBRUSH 和 HBITMAP 是完全独立的。句柄可以彼此完全独立地删除,并且一旦创建,对任何一个对象的更改都不会影响另一个。

于 2008-10-17T14:27:04.970 回答
4

画笔确实有自己的位图副本。通过在创建画笔后删除位图然后使用画笔很容易看到这一点(工作正常)

不幸的是,使用 GetObject 填充 LOGBRUSH 结构将返回成员 lbhatch 中的原始 BITMAP 句柄,而不是副本的句柄。如果删除位图,则在返回的位图句柄上使用 GetObject 会失败。

在这种情况下,任何人都知道如何从画笔中获取原始位图尺寸?即使删除了原始位图,我也希望创建图案画笔的副本。我可以简单地用画笔绘制原始位图的副本,但我不知道它的大小。我尝试使用 SetbrushorgEx (hdc, -1,-1),希望当我将画笔选择到设备上下文中时,-1 的模数会减少,并在我使用 GetBrushOrgEx 检索时获取值。不工作。

于 2009-06-17T12:58:30.097 回答
1

我认为位图必须比画笔更长寿:画笔只是引用现有位图而不是复制它。

你总是可以尝试一下,看看发生了什么。

于 2008-09-11T07:25:34.563 回答
1

我怀疑 CreatePatternBrush() API 复制了你给它的位图,因为 HBITMAP 是:

  1. 一个 GDI 句柄,其最大数量是有限的,以及
  2. 可能相当大。

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

于 2008-09-16T13:03:57.920 回答