Win32 CreatePatternBrush
Posted
技术标签:
【中文标题】Win32 CreatePatternBrush【英文标题】: 【发布时间】:2010-09-08 12:41:01 【问题描述】:MSDN 为 CreatePatternBrush 显示以下内容:
您可以在不删除图案画笔的情况下 影响相关的位图 使用 DeleteObject 函数。 因此,您可以使用它 位图创建任意数量的图案 刷子。
我的问题正好相反。如果 HBRUSH 长期存在,我可以在创建画笔后立即删除 HBITMAP 吗? IE:HBRUSH 是否存储自己的 HBITMAP 副本?
在这种情况下,我希望 HBRUSH 具有对象范围,而 HBITMAP 将具有方法范围(创建 HBRUSH 的方法)。
【问题讨论】:
【参考方案1】:HBRUSH 和 HBITMAP 是完全独立的。句柄可以彼此完全独立地删除,并且一旦创建,任何一个对象的更改都不会影响另一个对象。
【讨论】:
【参考方案2】:画笔确实有自己的位图副本。这很容易通过在创建画笔后删除位图然后使用画笔来查看(工作正常)
使用 GetObject 填充 LOGBRUSH 结构将返回成员 lbhatch 中的原始 BITMAP 句柄,但不幸的是,不会返回副本的句柄。如果删除位图,则在返回的位图句柄上使用 GetObject 将失败。
有人知道在这种情况下如何从画笔中获取原始位图尺寸吗?即使删除了原始位图,我也希望创建图案画笔的副本。我可以简单地用画笔绘制原始位图的副本,但我不知道它的大小。我尝试使用 SetbrushorgEx (hdc, -1,-1),希望当我将画笔选择到设备上下文中时,-1 的模数会减少,并在我使用 GetBrushOrgEx 检索时获取值。没用。
【讨论】:
【参考方案3】:我认为位图必须比画笔更长寿:画笔只是引用现有位图而不是复制它。
您总是可以尝试一下,看看会发生什么。
【讨论】:
【参考方案4】:我怀疑 CreatePatternBrush() API 会复制您给它的位图,因为 HBITMAP 是:
-
一个 GDI 句柄,其最大数量是有限的,并且
可能相当大。
Win32 和 GDI 倾向于保守地创建数据的内部副本,这仅仅是因为在创建它们的大多数 API 时(CreatePatternBrush() 可以追溯到 Windows 95,并且许多函数仍然较旧),内存和 GDI 句柄是供应比现在要有限得多。 (例如,Windows 95 需要在只有 4MB RAM 的系统上运行良好。)
【讨论】:
以上是关于Win32 CreatePatternBrush的主要内容,如果未能解决你的问题,请参考以下文章