#include-once

#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

; #INDEX# =======================================================================================================================
; Title .........: GUICreateTransparent
; AutoIt Version : 3.3.6.1
; Description ...: Transparente BildGUIs erstellen.
; Author(s) .....: UEZ und ein bisschen Großvater (www.autoit.de)
; Dll ...........:
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _GUICreate_Transparent
; ===============================================================================================================================


; #FUNCTION# ====================================================================================================================
; Name...........: _GUICreate_Transparent
; Description ...: Transparente Popup-GUIs aus Bildern (z.B. PNG) erstellen
; Syntax.........: _GUICreate_Transparent($sImage, $iLeft = -1, $iTop = -1, $iOpacity = 255)
; Parameters ....: $sImage   - Pfad zur Bilddatei
;                  $iLeft    - Bidschirmposition der linken Seite des GUI in Pixeln
;                  |Default  - -1 (zentriert)
;                  $iTop     - Bidschirmposition der oberen Seite des GUI in Pixeln
;                  |Default  - -1 (zentriert)
;                  $iOpacity - Transparenz für das gesamte GUI (siehe WinSetTrans())
;                  |Default  - 255 (nicht transparent)
; Return values .: Im Erfolgsfall: HWND des GUI aus GUICreate()
;                  Im Fehlerfall: False, @error wird gesetzt:
;                  |1 = GDIPlus konnte nicht gestartet werden
;                  |2 = Die Bilddatei konnte nicht geladen werden
; Author ........: UEZ (www.autoit.de/index.php?page=Thread&postID=199839#post199839)
; Modified.......: Großvater (www.autoit.de)
; Remarks .......: Das GUI wird immer in der Originalgröße des Bildes mit dem Style $WS_POPUP und dem
;                  Exstyle $WS_EX_LAYERED erstellt. Der Exstyle $WS_EX_LAYERED verträgt sich offenbar
;                  nicht mit normalen Child-GUIs. Controls müssen deshalb in (einer) eigenen GUI(s)
;                  mit den Exstyles $WS_EX_MDICHILD und $WS_EX_LAYERED und der HWND des Bild-GUI
;                  als Parent erstellt werden. Dafür liefert UEZ im o.a. Thread ein Beispiel.
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _GUICreate_Transparent($sImage, $iLeft = -1, $iTop = -1, $iOpacity = 255)
    ; GDIPlus starten
    If Not _GDIPlus_Startup() Then Return SetError(1, 0, 0)
    ; Bild laden
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    If @error Then
        _GDIPlus_Shutdown()
        Return SetError(2, 0, 0)
    EndIf
    Local $iWidth = _GDIPlus_ImageGetWidth($hImage)
    Local $iHeight = _GDIPlus_ImageGetHeight($hImage)
    ; GUI erstellen
    Local $hGUI = GUICreate("", $iWidth, $iHeight, $iLeft, $iTop, $WS_POPUP, $WS_EX_LAYERED)
    Local $hDCDst = _WinAPI_GetDC($hGUI)
    Local $hDCSrc = _WinAPI_CreateCompatibleDC($hDCDst)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _WinAPI_SelectObject($hDCSrc, $hBitmap)
    Local $tSize = DllStructCreate($tagSIZE)
    Local $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    Local $tSource = DllStructCreate($tagPOINT)
    Local $pSource = DllStructGetPtr($tSource)
    Local $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Local $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hDCDst, 0, $pSize, $hDCSrc, $pSource, 0, $pBlend, $ULW_ALPHA)
    ; Ressourcen freigeben
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hDCSrc)
    _WinAPI_ReleaseDC($hGUI, $hDCDst)
    _GDIPlus_Shutdown()
    ; HWND des GUI zurückgeben
    Return $hGUI
EndFunc   ;==>_GUICreate_Transparent