Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Имеется чёрная картинка с альфа каналом, как с помощью GDIPlus изменить её цвет например на синий?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>
Global $Width = 500
Global $Height = 300
Global $SizeShadow = 15
Global $TransShadow = 130
$hShadow = GUICreate("", ($Width + ($SizeShadow * 2)), ($Height + ($SizeShadow * 2)) - 5, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
SetWindowShadow($hShadow, @ScriptDir & "\Shadow.png", $TransShadow)
GUISetState()
$hForm = GUICreate("", $Width, $Height, -1, -1, BitOR($WS_CHILD, $WS_POPUP), -1, $hShadow)
GUICtrlCreateLabel("", 0, 0, $Width, $Height, -1, $GUI_WS_EX_PARENTDRAG)
$hPos = WinGetPos($hShadow)
WinMove($hForm, "", $hPos[0] + $SizeShadow, $hPos[1] + ($SizeShadow - 2))
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func SetWindowShadow($hWnd, $hImage, $Transparant)
$iSize = WinGetPos($hWnd)
_GDIPlus_Startup()
$iImage = __LoadImage($hImage)
$hThumb = DllCall($ghGDIPDll, "int", "GdipGetImageThumbnail", "ptr", $iImage, "int", $iSize[2], "int", $iSize[3], "ptr*", 0, "ptr", 0, "ptr", 0)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hThumb[4])
_WinAPI_UpdateLayeredWindowEx($hWnd, -1, -1, $hBitmap, $Transparant)
_GDIPlus_ImageDispose($hThumb[4])
_GDIPlus_ImageDispose($iImage)
_GDIPlus_Shutdown()
EndFunc
Func __LoadImage($hImage)
Local $sData, $hSize, $hStruct, $hData, $pData, $pStream, $pBitmap
If StringLen($hImage) < 100 Then
Return _GDIPlus_ImageLoadFromFile($hImage)
Else
$sData = Binary($hImage)
$hSize = BinaryLen($sData)
$hStruct = DllStructCreate("byte[" & $hSize & "]")
DllStructSetData($hStruct, 1, $sData)
$hData = DllCall("kernel32.dll", "handle", "GlobalAlloc", "uint", 2, "ulong_ptr", $hSize)
$pData = DllCall("kernel32.dll", "ptr", "GlobalLock", "handle", $hData[0])
DllCall("kernel32.dll", "none", "RtlMoveMemory", "ptr", $pData[0], "ptr", DllStructGetPtr($hStruct), "ulong_ptr", $hSize)
DllCall("kernel32.dll", "bool", "GlobalUnlock", "handle", $hData[0])
$pStream = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData[0], "long", 1, "Int*", 0)
$pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream[3], "int*", 0)
If Not @error Then Return $pBitmap[2]
_GDIPlus_BitmapDispose($pBitmap[2])
_WinAPI_DeleteObject($pStream[3])
DllCall("kernel32.dll", "ptr", "GlobalFree", "handle", $hData[0])
EndIf
EndFunc
Func WM_MOVE()
Local $aParent = WinGetPos($hForm)
WinMove($hShadow, "", $aParent[0] - $SizeShadow, $aParent[1] - ($SizeShadow - 2))
EndFunc