2008-09-11 4 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 должна была хорошо работать в системе с 4 МБ ОЗУ.)

4

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

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

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

Смежные вопросы