UEZ hat hier ein schönes Beispiel für den Umgang mit "Layered Windows" eingestellt. Damit kann man u.a. (teil)transparente GUIs aus Bildern erstellen, ohne dass ständig neu gezeichnet werden muss. Damit das nicht im Hilfeforum untergeht, habe ich ihn gebeten, es in Form einer UDF hier einzustellen. Er hat leider im Augenblick nicht die Zeit dafür, deshalb habe ich mich mit seinem Einverständnis darüber hergemacht:
Demo.au3
#include <GUIConstantsEx.au3>
#include "GUICreateTransparent.au3"
Global Const $SC_DRAGMOVE = 0xF012
Global $sBildURL = "http://www.autoit.de/index.php?page=Attachment&attachmentID=11980&h=3e1f01006e7557e85e5957cfa8c04a385ebf559a"
Global $sBilddatei = @ScriptDir & "\bg.png"
If Not FileExists($sBilddatei) Then
$Result = MsgBox(4, "Bild laden", 'Soll das Bild "bg.png" von' & @CRLF & @CRLF & _
$sBildURL & @CRLF & @CRLF & 'heruntergeladen werden?')
If $Result <> 6 Then Exit
InetGet($sBildURL, $sBilddatei)
EndIf
; Transparentes GUI erzeugen
$hGUI = _GUICreate_Transparent($sBilddatei)
; Child-GUI mit Controls erzeugen
$hChild = GUICreate("MDIChild", 400, 400, 150, 150, $WS_POPUP, $WS_EX_MDICHILD + $WS_EX_LAYERED, $hGUI)
GUISetBkColor(0x123456)
GUICtrlCreateButton("Button 1", 20, 20)
GUICtrlCreateButton("Button 2", 20, 50)
GUICtrlCreateButton("Button 3", 20, 80)
GUICtrlCreateInput("Input 1", 20, 110, -1, 20)
; Hintergrundfarbe des Child-GUI transparent setzen
_WinAPI_SetLayeredWindowAttributes($hChild, 0x123456, 0xff)
GUISetState(@SW_SHOW, $hGUI)
GUISetState(@SW_SHOW, $hChild)
; Wenn man das GUI bewegen will
GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Exit
Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
_SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
EndFunc ;==>_WM_LBUTTONDOWN
GUICreateTransparent.au3
#include-once
[/autoit] [autoit][/autoit] [autoit]#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 (http://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 (http://www.autoit.de/index.php?page…9839#post199839)
; Modified.......: Großvater (http://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
Viel Spaß damit!
Update am 23.12.2010:
Wegen des von autoBert gemeldeten Fehlers unter WinXP habe ich die Namen der DCs an die in UpdateLayeredWindow() verwendeten Konventionen angepasst und den Funktionsaufruf entsprechend geändert.
Damit läuft es auch in meinem virtuellen XP.