MSDN为CreatePatternBrush显示以下内容:
您可以删除图案画笔 影响关联的位图 使用DeleteObject函数。 因此,您可以使用它 位图创建任意数量的模式 刷。
我的问题恰恰相反。如果HBRUSH存在很长时间,我可以在创建画笔后立即删除HBITMAP吗? IE:HBRUSH是否存储了自己的HBITMAP副本?
在这种情况下,我希望HBRUSH具有对象范围,而HBITMAP具有方法范围(创建HBRUSH的方法)。
答案 0 :(得分:5)
HBRUSH和HBITMAP是完全独立的。句柄可以完全相互独立地删除,一旦创建,任何对象的更改都不会影响另一个。
答案 1 :(得分:4)
画笔确实有自己的位图副本。通过在创建画笔之后删除位图,然后使用画笔(工作正常)
,可以很容易地看到这一点使用GetObject填充LOGBRUSH结构将返回成员lbhatch中的原始BITMAP句柄,但遗憾的是,不是副本的句柄。如果删除位图,则在返回的位图句柄上使用GetObject会失败。
在这种情况下,任何人都知道如何从画笔中获取原始位图尺寸?我希望创建一个模式画笔的副本,即使删除原始位图。我只需要用画笔绘画就可以获得原始位图的副本,但我不知道它的大小。我尝试使用SetbrushorgEx(hdc,-1,-1),希望在刷入选择到设备上下文时将-1的模数减去模数,并在使用GetBrushOrgEx检索时获取值。不起作用。
答案 2 :(得分:1)
我认为位图必须比画笔更长:画笔只是引用现有的位图而不是复制它。
你可以随时尝试,看看发生了什么。
答案 3 :(得分:1)
我怀疑CreatePatternBrush()API会复制您提供的位图,因为HBITMAP是:
Win32和GDI对于创建数据的内部副本往往保守,如果只是因为他们创建了大多数API(CreatePatternBrush()发布到Windows 95,并且许多函数仍然较旧),内存和GDI句柄是供应比现在更有限。 (例如,Windows 95需要在只有4MB RAM的系统上运行良好。)