Win32 CreatePatternBrush - PullRequest
       16

Win32 CreatePatternBrush

4 голосов
/ 11 сентября 2008

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 17 октября 2008

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

4 голосов
/ 17 июня 2009

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

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

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

1 голос
/ 16 сентября 2008

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

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

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

1 голос
/ 11 сентября 2008

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

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

...