Win32 CreatePatternBrush

时间:2008-09-11 07:13:24

标签: winapi gdi

MSDN为CreatePatternBrush显示以下内容:

  

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

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

画笔确实有自己的位图副本。通过在创建画笔之后删除位图,然后使用画笔(工作正常)

,可以很容易地看到这一点

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

在这种情况下,任何人都知道如何从画笔中获取原始位图尺寸?我希望创建一个模式画笔的副本,即使删除原始位图。我只需要用画笔绘画就可以获得原始位图的副本,但我不知道它的大小。我尝试使用SetbrushorgEx(hdc,-1,-1),希望在刷入选择到设备上下文时将-1的模数减去模数,并在使用GetBrushOrgEx检索时获取值。不起作用。

答案 2 :(得分:1)

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

你可以随时尝试,看看发生了什么。

答案 3 :(得分:1)

我怀疑CreatePatternBrush()API会复制您提供的位图,因为HBITMAP是:

  1. 一个GDI句柄,其最大数量是有限的,
  2. 可能非常大。
  3. Win32和GDI对于创建数据的内部副本往往保守,如果只是因为他们创建了大多数API(CreatePatternBrush()发布到Windows 95,并且许多函数仍然较旧),内存和GDI句柄是供应比现在更有限。 (例如,Windows 95需要在只有4MB RAM的系统上运行良好。)