Win32的CreatePatternBrush

时间:2020-03-05 18:51:16  来源:igfitidea点击:

MSDN为CreatePatternBrush显示以下内容:

You can delete a pattern brush without
  affecting the associated bitmap by
  using the DeleteObject function.
  Therefore, you can then use this
  bitmap to create any number of pattern
  brushes.

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

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

解决方案

回答

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

我们可以随时尝试一下,看看发生了什么。

回答

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

  • 一个GDI句柄,其最大数量受到限制,并且
  • 可能很大。

Win32和GDI在创建数据的内部副本时往往比较保守,仅是因为创建它们的大多数API时(CreatePatternBrush()的日期为Windows 95,并且许多函数的版本仍然较旧),内存和GDI句柄却更多供给比现在有限。 (例如,要求Windows 95在只有4MB RAM的系统上运行良好。)

回答

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

回答

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

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

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