Hallo liebe AutoIT Gemeinde,
ich bin am verzweifeln. Ich komme mit der eigentlichen Programmierung in AutoIT echt gut klar, allerdings in Sachen eigener GUI nicht wirklich. Ich würde gerne eine eigene einfache GUI basteln (siehe anbei). Dort habe ich zwei Funktionsbuttons eingebaut: 1. schließen und 2. minimieren.
So weit so gut. Das eigentliche Programm mit dem Bild als Hintergrund bekomme ich auch hin. Jetzt habe ich allerdings das Problem denen im Bild enthaltenen Elementen Leben ein zu hauchen. Also dem "X" beispielsweise das schließen zu "lernen". Ich habe es versucht mit Bild darüber legen, Button mit Bild, usw... leider hat noch nichts geklappt. Wie mache ich das richtig? Oder mache ich hierbei grundsätzlich etwas falsch bzw. geht es einfacher!?
Spoiler anzeigen
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
Global $pic_background = @ScriptDir&"\bg2.png"
Global Const $AC_SRC_ALPHA = 1
; Hauptfenster für den Hintergrund
$GUI = GUICreate("", 660, 500, -1, -1, $WS_POPUP, BitOR($WS_EX_CONTROLPARENT, $WS_EX_LAYERED))
_GDIPlus_Startup() ; lade und aktiviere GDI+
Global $hImageGUIBK = _GDIPlus_ImageLoadFromFile($pic_background) ; lade Hintergrunddatei per GDI+
SetBitmap($GUI, $hImageGUIBK, 255) ; setze Alpha vom Fenster des Bildes auf 255 (transparent)
; => Fenster für buttons etc.
$GUIsub = GUICreate("", 660, 500, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $GUI)
GUISetBkColor(0x585858) ; => hintergrund ebenfalls durchsichtig, damit die buttons direkt auf das Hintergrundbild gesetzt werden
_WinAPI_SetLayeredWindowAttributes($GUIsub, 0x585858)
;$icon_exit = GUICtrlCreatePic(@ScriptDir&"\bg2.png", 224, 168, 73, 57)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $GUI)
GUISetState(@SW_SHOW, $GUIsub)
While 1
$Msg = GUIGetMsg() ;
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
;Case $icon_exit
;Exit
EndSwitch
WEnd
Func SetBitmap($hGUI, $hImage, $iOpacity) ; lade hintergrundbild und mache den hintergrund transparent
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc
Viele Grüße und vielen Dank,
Benni