#Include <APIConstants.au3>
#Include <Misc.au3>
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>
Opt('TrayMenuMode', 1)
Global Const $hAutoIt = WinGetHandle(AutoItWinGetTitle())
; Загружаем библиотеку GDI+
_GDIPlus_Startup()
; Загружаем изображение
$hPng = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Poof.png')
; Определяем количество кадров, ширина и высота кадра должны быть равны
$Size = _GDIPlus_ImageGetDimension($hPng)
If @error Then
Exit
EndIf
$Count = $Size[1] / $Size[0]
If Not IsInt($Count) Then
Exit
EndIf
; Разрезаем картинку на кадры и создаем массив из указателей на GDI битмапы (DDB) для последующей анимации
Dim $hBitmap[$Count]
For $i = 0 To $Count - 1
$hImage = _GDIPlus_BitmapCloneArea($hPng, 0, $Size[0] * $i, $Size[0], $Size[0], $GDIP_PXF32ARGB)
$hBitmap[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)
Next
; Освобождаем ресурсы GDI+
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()
; Создаем GUI для анимации, родительское окно - скрытое окно AutoIt (для подавления появления иконки окна в TaskBar'е)
$hPopup = GUICreate('', -1, -1, -1, -1, BitOR($WS_DISABLED, $WS_POPUPWINDOW), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), $hAutoIt)
$Exit = TrayCreateItem('Exit')
; Выводим анимированное изображение при нажатии средней клавиши мыши
Do
If _IsPressed('01') Then
_Animate()
EndIf
Until TrayGetMsg() = $Exit
Func _Animate()
Local $Pos, $Reset, $Timer
GUISetState(@SW_SHOWNOACTIVATE, $hPopup)
While 1
$Pos = MouseGetPos()
For $i = 0 To 1
$Pos[$i] -= $Size[0] / 2
Next
$Reset = 0
For $i = 0 To $Count - 1
_WinAPI_UpdateLayeredWindowEx($hPopup, $Pos[0], $Pos[1], $hBitmap[$i])
$Timer = TimerInit()
Do
If _IsPressed('01') Then
If $Reset Then
ContinueLoop 3
EndIf
Else
$Reset = 1
EndIf
Until TimerDiff($Timer) > 100
Next
ExitLoop
WEnd
_WinAPI_UpdateLayeredWindowEx($hPopup, -1, -1, 0, 0)
GUISetState(@SW_HIDE, $hPopup)
While _IsPressed('01')
Sleep(10)
WEnd
EndFunc ;==>_Animate
#Region GDI+ Functions
Func _GDIPlus_ImageGetDimension($hImage)
Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hImage, 'float*', 0, 'float*', 0)
If @error Then
Return SetError(1, 0, 0)
Else
If $Ret[0] Then
Return SetError(1, $Ret[0], 0)
EndIf
EndIf
Local $Result[2]
$Result[0] = $Ret[2]
$Result[1] = $Ret[3]
Return $Result
EndFunc ;==>_GDIPlus_ImageGetDimension
#EndRegion GDI+ Functions