Win32 CreatePatternBrush

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

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

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

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

winapi,gdi,

4

Ответов: 4


5 принят

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


4

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

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

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


1

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

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


1

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

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

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

WinAPI, ВВД
Похожие вопросы
Яндекс.Метрика