Win32 CreatePatternBrush

5

MSDN显示CreatePatternBrush的以下内容:

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

我的问题与之相反。 如果HBRUSH存活时间很长,我能否在创建画刷后立即删除HBITMAP? 即:HBRUSH是否存储其自己的HBITMAP副本?

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

4个回答

5

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


4
刷子确实有自己的位图副本。这可以通过在创建刷子后删除位图,然后使用刷子(正常工作)来轻松看到。
使用GetObject填充LOGBRUSH结构将返回成员lbhatch中的原始BITMAP句柄,而不是副本的句柄。不幸的是,如果删除位图,则在返回的位图句柄上使用GetObject会失败。
有人知道如何在这种情况下从刷子中获取原始位图尺寸吗?我希望即使删除了原始位图,也能创建图案刷子的副本。我可以通过使用刷子绘画来获得原始位图的副本,但我不知道它的大小。我尝试使用SetbrushorgEx(hdc,-1,-1),希望当刷子选择到设备上下文并检索GetBrushOrgEx时,-1会减少模其尺寸。不起作用。

1

我认为位图必须比画刷存在更久:画刷只是引用现有的位图而非复制它。

你可以尝试一下,看看会发生什么。


1

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

  1. GDI句柄,其最大数量受限,并且
  2. 可能相当大。

Win32和GDI倾向于保守地创建您数据的内部副本,仅因为它们的大多数API是在更加有限的内存和GDI句柄供应情况下创建的(例如,CreatePatternBrush()的日期可以追溯到Windows 95,许多功能甚至更早),而现在这些资源已经不再那么有限。(例如,Windows 95需要在只有4MB RAM的系统上运行良好。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接