Hey
Ich möchte auf ein Bmp32 den Hintergrund transparent machen. Das ausgeklammerte habe ich extra nicht benutzt, da es nicht so richtig funktioniert..
Hier das Skript:
Spoiler anzeigen
#include <Misc.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <WinAPIEX.au3>
;Variablen deklarieren
Global $hGUI, $hGraphics, $hBitmap, $hBackBuffer, $hPen
Global $hDLL, $Pos, $_Pos[2]
;GDI+ initialisieren, DLL für _IsPressed öffnen und ESC als HotKey festlegen
_GDIPlus_Startup()
$hDLL = DllOpen("user32.dll")
HotKeySet("{ESC}","_Exit")
;Transparente GUI erstellen
$hDummy = GUICreate("") ; Dummy GUI, damit richtiges nicht in Taskleiste auftaucht.
$hGUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST,$WS_EX_TRANSPARENT),$hDummy)
GUISetBkColor(0xABCDEF, $hGUI)
_WinAPI_SetLayeredWindowAttributes($hGUI, 0xABCDEF, 255)
;Graphic-Objekt, Pinsel und Backbuffer erstellen und GUI anzeigen
$hPen = _GDIPlus_PenCreate(0xFFFF0000,3) ; Roten Pinsel mit Breite von 4 px.
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $hGraphics)
$hBackBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
GUISetState()
While 1
$Pos = MouseGetPos()
If $Pos[0]<>$_Pos[0] And $Pos[1]<>$_Pos[1] then
;GUISetBkColor(0xABCDEF, $hGUI)
;$_hBitmap = _GDIPlus_BitmapCreateFromGraphics(@DesktopWidth, @DesktopHeight, $hGraphics)
;$_hBackBuffer = _GDIPlus_ImageGetGraphicsContext($_hBitmap)
;_GDIPlus_GraphicsDrawLine($_hBackBuffer, 50, 50, $Pos[0], $Pos[1],$hPen)
;_GDIPlus_GraphicsDrawImage($hGraphics, $_hBitmap, 0, 0)
;_GDIPlus_ImageDispose($_hBackBuffer)
;_GDIPlus_BitmapDispose($_hBitmap)
Local $_ptr,$_hbmp
$_hDC = _Bmp32_Create(@DesktopWidth,@DesktopHeight,$_ptr,$_hbmp)
$_hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($_hbmp)
$_hBackBuffer = _GDIPlus_ImageGetGraphicsContext($_hBitmap)
_GDIPlus_GraphicsDrawLine($_hBackBuffer, 50, 50, $Pos[0], $Pos[1],$hPen)
_GDIPlus_GraphicsDrawImage($hGraphics, $_hBitmap, 0, 0)
_GDIPlus_ImageDispose($_hBackBuffer)
_Bmp32_Delete($_hDC,$_hbmp)
$_Pos=$Pos
EndIf
WEnd
Func _Exit()
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_PenDispose($hPen)
GUIDelete($hGUI)
DLLClose($hDLL)
Exit
EndFunc
#cs
_Bmp32 Funks von Andy
Umbenannt von mir
#ce
Func _Bmp32_Delete($hDC, $hbmp)
_WinAPI_DeleteObject($hbmp)
_WinAPI_ReleaseDC(0, $hDC)
EndFunc ;==>_Delete_Bitmap32
Func _Bmp32_Create($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
;_arraydisplay($adib)
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
Danke für eure Hilfe
MfG AntiSpeed