Что нового

[Графика GDIPlus] Создание hImage из Bitmap

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Для чего это вообще нужно?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied [?]
Для чего это вообще нужно?
Не всегда имеет смысл хранить первоначальный Bitmap. Могу ошибаться, мне кажется, что при вызове _GDIPlus_Shutdown они должны бы удалятся.
А при получении HBITMAP функцией _SendMessage($hWnd, 0x0173), первоначального Bitmap вообще может не быть.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
asdf8, здесь есть много нюансов. Поэтому я и спрашиваю какова конечная цель этих преобразований. Битмап нужен для вставк и в WS_EX_LAYERED окно или в GUI? Можно более подробно расписать задачу?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Битмап мне нужен, чтобы провести с ним матричные преобразования (_GDIPlus_ColorMatrix... из GDIP UDF), перевести его в HBITMAP, и далее уже пользоваться им для вставки в GUICtrlCreatePic.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
В этом случае хранишь в памяти последний битмап GDI+, а в Pic вставляешь DIB c помощью SendMessage(). Если изображение содержит прозрачность, то необходимо будет обновлять часть основного окна под Pic, чтобы не было наложений. Но это спровоцирует мерцания. Чтобы избежать мерцаний я рекомендую вставлять в Pic не "прозрачную" картинку, а с таким же фоном, что и у основного окна (если возможно).

P.S

Для WS_EX_LAYERED окна нужно использовать DDB - _GDIPlus_BitmapCreateHBITMAPFromBitmap().


P.S.S

_GDIPlus_BitmapCreateFromHBITMAP() не поддерживает прозрачность.



Добавлено:
Сообщение автоматически объединено:

Кстати, если ты "схлопнешь" изображение с фоном, то достаточно будет использовать _GDIPlus_BitmapCreateHBITMAPFromBitmap() для вставки в Pic.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied
Спасибо. Может это добавить в НЕофициальный FAQ AutoIt?
Правда в моем случае трудно хранить битмап GDI+, во-первых он действительно разрушается при вызове _GDIPlus_Shutdown, во-вторых HBITMAP является вырезкой из битмапа GDI+ (каждый раз вырезать - довольно накладно по времени). И фон у меня - картинка. Поэтому и нужна была функция _GDIPlus_BitmapCreateFromHBITMAP с поддержкой прозрачности.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
asdf8 сказал(а):
...во-первых он действительно разрушается при вызове _GDIPlus_Shutdown...

_GDIPlus_Shutdown() вообще не нужна (Windows автоматически все уничтожает при завершении процесса), ну или вызывать один раз перед выходом из программы.

asdf8 сказал(а):
...во-вторых HBITMAP является вырезкой из битмапа GDI+ (каждый раз вырезать - довольно накладно по времени).

Нет, не накладно. В любом случае, если изначальный битмап GDI+ еще нужен, то лучше хранить его в памяти для последующего использования. Если нужна вырезка, то можно хранить ее, но конвертить туда-сюда, это неправильный подход.

asdf8 сказал(а):
И фон у меня - картинка. Поэтому и нужна была функция _GDIPlus_BitmapCreateFromHBITMAP с поддержкой прозрачности.

Если картинка статичная, то лучше в качестве фона использовать соответствующую часть этой картинки аккурат под Pic. Это справедливо, если планируется анимация, дабы избежать мерцаний. Если изображение в Pic вставляется один раз и на долго, то можно обойтись DIB с прозрачностью, и после очередного обновления вызывать _WinAPI_InvalidateRect() для родительского окна с указанием размера Pic.
 
Верх