Win32 CreatePatternBrush

MSDN отображает следующее для CreatePatternBrush:

Вы можете удалить узорчатую кисть, не затрагивая связанное с ней растровое изображение, используя функцию DeleteObject. Таким образом, вы можете использовать это растровое изображение для создания любого количества узорчатых кистей.

Мой вопрос наоборот. Если HBRUSH долгоживущий, могу ли я удалить HBITMAP сразу после создания кисти? IE: хранит ли HBRUSH собственную копию HBITMAP?

В этом случае я бы хотел, чтобы у HBRUSH была область видимости объекта, а у HBITMAP была бы область действия метода (метод, создающий HBRUSH).


person Luther Baker    schedule 11.09.2008    source источник


Ответы (4)


HBRUSH и HBITMAP полностью независимы. Дескрипторы могут быть удалены совершенно независимо друг от друга, и после их создания никакие изменения ни одного из объектов не повлияют на другой.

person Chris Becke    schedule 17.10.2008

У кисти есть собственная копия растрового изображения. Это легко увидеть, удалив растровое изображение после создания кисти, а затем используя кисть (отлично работает)

Однако использование GetObject для заполнения структуры LOGBRUSH вернет исходный дескриптор BITMAP в элементе lbhatch, а не дескриптор копии, к сожалению. И использование GetObject для возвращаемого дескриптора растрового изображения завершается ошибкой, если растровое изображение удалено.

Кто-нибудь знает, как в этом случае получить исходные размеры растрового изображения из кисти? Я хочу создать копию узорчатой ​​кисти, даже если исходное растровое изображение удалено. Я могу получить копию оригинального растрового изображения, просто рисуя кистью, но я не знаю его размера. Я попытался использовать SetbrushorgEx (hdc, -1, -1), надеясь, что -1 будут уменьшены по модулю его размеров, когда кисть выбрана в контексте устройства, и получить значения при извлечении с помощью GetBrushOrgEx. Не работает.

person Community    schedule 17.06.2009

Я думаю, что растровое изображение должно пережить кисть: кисть просто ссылается на существующее растровое изображение, а не копирует его.

Вы всегда можете попробовать и посмотреть, что получилось.

person Anthony Williams    schedule 11.09.2008

Я сомневаюсь, что API CreatePatternBrush() копирует растровое изображение, которое вы ему даете, поскольку HBITMAP:

  1. дескриптор GDI, максимальное количество которых ограничено, и
  2. потенциально довольно большой.

Win32 и GDI, как правило, консервативны в создании внутренних копий ваших данных, хотя бы потому, что, когда большинство их API были созданы (CreatePatternBrush() восходит к Windows 95, а многие функции еще старше), дескрипторы памяти и GDI были в гораздо большем количестве. ограниченное предложение, чем сейчас. (Например, Windows 95 должна была хорошо работать в системе с 4 МБ ОЗУ.)

person Matthew Xavier    schedule 16.09.2008