2008-09-11 33 views
4

MSDN顯示CreatePatternBrush如下:的Win32 CreatePatternBrush

您可以通過 使用DeleteObject的功能刪除圖案畫筆不 影響相關的位圖。 因此,您可以使用此 位圖創建任意數量的圖案 畫筆。

我的問題恰恰相反。如果HBRUSH長期存在,我可以在創建畫筆後立即刪除HBITMAP嗎? IE:HBRUSH是否存儲了自己的HBITMAP副本?

在這種情況下,我希望HBRUSH具有對象範圍,而HBITMAP具有方法範圍(創建HBRUSH的方法)。

回答

5

HBRUSH和HBITMAP完全獨立。這些句柄可以完全相互獨立地刪除,並且一旦創建,任何一個對象的變化都不會影響另一個。

1

我認爲位圖必須超過筆刷:筆刷只是引用現有的位圖而不是複製它。

你可以隨時嘗試一下,看看發生了什麼。

1

我懷疑CreatePatternBrush()API的副本,你給它,因爲一個HBITMAP是位圖:

  1. 一個GDI手柄,其最大數目是有限的,而
  2. 可能相當大。

Win32和GDI趨向保守有關,創建數據的內部副本,如果僅僅是因爲在大部分的API創建(CreatePatternBrush()可以追溯到Windows 95和許多功能是老年人還是),內存和GDI手柄的供應遠比現在供應有限。 (例如,Windows 95需要在只有4MB RAM的系統上運行良好。)

4

筆刷確實有它自己的位圖副本。通過在創建畫筆並使用畫筆(使用畫筆)後刪除位圖很容易看到(工作正常)

使用GetObject填充LOGBRUSH結構將返回成員lbhatch中的原始BITMAP句柄,但不是副本的句柄,不幸。如果位圖被刪除,則在返回的位圖句柄上使用GetObject會失敗。

任何人都知道如何在這種情況下從刷子獲取原始位圖尺寸?即使原始位圖被刪除,我也想創建一個圖案筆刷的副本。我可以簡單地通過使用筆刷繪畫來獲得原始位圖的副本,但我不知道它的大小。我嘗試使用SetbrushorgEx(hdc,-1,-1),希望當使用GetBrushOrgEx進行檢索時,將刷子選擇到設備上下文中時,將減少-1的模數。不起作用。