HBRUSH и HBITMAP полностью независимы. Ручки могут быть удалены полностью независимыми друг от друга, и после их создания никакие изменения ни для одного объекта не будут влиять на другие.
MSDN отображает следующее для CreatePatternBrush:
Вы можете удалить кисть шаблона, не затрагивая связанный растровый рисунок, используя функцию DeleteObject. Поэтому вы можете использовать это растровое изображение для создания любого количества кистей шаблонов.
Мой вопрос противоположный. Если HBRUSH долговечен, могу ли я удалить HBITMAP сразу после создания кисти? IE: хранит ли HBRUSH свою собственную копию HBITMAP?
В этом случае я хотел бы, чтобы HBRUSH имел область объекта, в то время как HBITMAP имел бы область методов (метод, который создает HBRUSH).
У кисти есть своя копия растрового изображения. Это легко увидеть, удалив растровое изображение после создания кисти, а затем используя кисть (отлично работает)
К сожалению, использование GetObject для заполнения структуры LOGBRUSH приведет к возврату оригинального дескриптора BITMAP в элемент lbhatch, но не к дескриптору копии. И использование GetObject в возвращаемом дескрипторе растрового изображения завершается с ошибкой, если битмап удален.
Кто-нибудь знает, как получить исходные размеры растровых изображений из кисти в этом случае? Я хочу создать копию кисти шаблона, даже если исходное растровое изображение будет удалено. Я могу получить копию оригинального растрового изображения просто путем рисования кистью, но я не знаю, что это размер. Я попытался использовать SetbrushorgEx (hdc, -1, -1), надеясь, что -1 будет уменьшаться по модулю по размерам, когда кисть выбирается в контексте устройства и получает значения при получении GetBrushOrgEx. Не работает.
Я сомневаюсь, что API CreatePatternBrush () копирует растровое изображение, которое вы ему даете, поскольку HBITMAP:
Win32 и GDI имеют тенденцию быть консервативными в отношении создания внутренних копий ваших данных, хотя бы потому, что, когда большинство их API были созданы (даты CreatePatternBrush () для Windows 95, а многие функции еще старше), память и дескрипторы GDI были намного больше ограниченное предложение, чем сейчас. (Например, Windows 95 должна была хорошо работать в системе с 4 МБ ОЗУ.)