[AutoIT Frage] Anstatt Gui Fenster ein Tranparentes Bild nehmen?

10/28/2010 14:19 Mr. Pancake-Trader#1
Hey Leute,
Vorweg diese Frage gibts hier noch nicht oder wurde noch nicht beantwortet hab bereits alles durchsucht -.-"
Gut nun zu meiner Frage ist es möglich anstatt des normalen Fensters (Also wenn man mit Koda einfach ne Gui ohne alles erstellt) ein Bild zu verwenden und darauf Buttons usw zu setzen, Aber jetzt kommt das Problem das Bild soll transparent sein, also so wie der Patcher von Heavenmt2 also der neue natürlich ;)
Ist sowas in AutoIt zu machen wenn ja wie?
Wenns nicht geht kann man eine Dll oder sowas in der Art programmieren und in AutoIt einfügen?

Lg .Pancake
10/28/2010 17:19 Fuii#2
Dafür musst du auf die GDI+ Bibliothek/API zurückgreifen (#include <GDIPlus.au3>) und 2 Fenster erstellen.

Fenster 1 = Hauptfenster und nur für den Hintergrund
Fenster 2 = child-Fenster von Fenster 1 und für labels/buttons etc.

Fenster 2 muss transparent gemacht werden, damit die labels/buttons/... direkt auf dem Hintergrund liegen.

... ein Beispiel:
(zur besseren Lesbarkeit am Besten nach SciTE kopieren)

PHP Code:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global $pngSrcGUIBK "C:\bkg.png"

Hauptfenster für den Hintergrund
$GUI 
GUICreate(""942528, -1, -1$WS_POPUPBitOR($WS_EX_CONTROLPARENT$WS_EX_LAYERED))
_GDIPlus_Startup() ; lade und aktiviere GDI
Global 
$hImageGUIBK _GDIPlus_ImageLoadFromFile($pngSrcGUIBK) ; lade Hintergrunddatei per GDI+
SetBitmap($GUI$hImageGUIBK255) ; setze Alpha vom Fenster des Bildes auf 255 (transparent)


; => 
Fenster für buttons etc.
$GUIsub GUICreate(""942528, -1, -1$WS_POPUPBitOR($WS_EX_LAYERED$WS_EX_MDICHILD), $GUI)
GUISetBkColor(0x585858)    ; => hintergrund ebenfalls durchsichtigdamit die buttons direkt auf das Hintergrundbild gesetzt werden
_WinAPI_SetLayeredWindowAttributes
($GUIsub0x585858)



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$hScrDC0$pSize$hMemDC$pSource0$pBlend$ULW_ALPHA)
    
_WinAPI_ReleaseDC(0$hScrDC)
    
_WinAPI_SelectObject($hMemDC$hOld)
    
_WinAPI_DeleteObject($hBitmap)
    
_WinAPI_DeleteDC($hMemDC)
EndFunc 

GDI+ zu meistern ist aber schon deutlich höhere Kunst als einfach nur ein 0815 GUI per Koda zu erstellen.
Damit kannst du auch Animationen usw. einbinden.
10/28/2010 17:19 eagly200#3
würde mich auch interresieren...
So könnte man auch ne Transparente Uhr programmieren.
10/28/2010 18:10 Mr. Pancake-Trader#4
@Fuii
Danke dir für deine Hilfe, sowas hab ich gesucht^^
Nur dein Skript funktioniert bei mir nicht so ganz -.-"

## Fehlermeldung ##
PHP Code:
WARNING$AC_SRC_ALPHApossibly used before declaration
ERROR
$AC_SRC_ALPHAundeclared global variable 
Wenn ich die Variable ganz am Anfang als Globale Variable deklariere passiert gar nicht :confused:
Vllt. könntest du mir da auch weiterhelfen^^

@eagly200
Nicht nur ne Uhr kannste damit machen^^
Dir steht die ganze Welt damit offen :P (Naja net ganz^^)
Die Programme kommen dann net ganz so billig rüber xD

Greetz
10/28/2010 18:26 Fuii#5
Ah, mein Fehler.
Die muss vorher natürlich deklariert werden und zwar als Konstante mit dem Wert 1.

Einfach nach den includes, bzw. bei deinen Variablen noch hinzufügen:

PHP Code:
Global Const $AC_SRC_ALPHA 
Und du musst natürlich den Pfad zur Hintergrunddatei (pngSrcGUIBK = "C:\bkg.png") ändern.
10/28/2010 20:19 Mr. Pancake-Trader#6
Irgenwie funktionierts noch nicht =(
Liegt daran das keine While Schleife drin ist da sich dann das Programm sofort schließt oder?
Aber wenn ich eine rein bau funktionierts auch noch nicht, kannst du das mal bei dir ausprobieren bitte?^^
10/28/2010 20:23 eagly200#7
wie würde das mit ner Uhr gehen???, dann muss ich net extra nen thread aufmachen.
10/28/2010 20:25 Fuii#8
Naja, etwas Vorwissen hätte ich schon vorrausgesetzt.
So musst du neben der while Schleife die beiden Fenster auch noch einblenden (GUISetState()) du Nase. ;)

Voller Code:
PHP Code:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global $pngSrcGUIBK "Pfad\zu\Hintergrunddatei"
Global Const $AC_SRC_ALPHA 1

Hauptfenster für den Hintergrund
$GUI 
GUICreate(""942528, -1, -1$WS_POPUPBitOR($WS_EX_CONTROLPARENT$WS_EX_LAYERED))
_GDIPlus_Startup() ; lade und aktiviere GDI+
Global 
$hImageGUIBK _GDIPlus_ImageLoadFromFile($pngSrcGUIBK) ; lade Hintergrunddatei per GDI+
SetBitmap($GUI$hImageGUIBK255) ; setze Alpha vom Fenster des Bildes auf 255 (transparent)


; => 
Fenster für buttons etc.
$GUIsub GUICreate(""942528, -1, -1$WS_POPUPBitOR($WS_EX_LAYERED$WS_EX_MDICHILD), $GUI)
GUISetBkColor(0x585858)    ; => hintergrund ebenfalls durchsichtigdamit die buttons direkt auf das Hintergrundbild gesetzt werden
_WinAPI_SetLayeredWindowAttributes
($GUIsub0x585858)

GUISetState(@SW_SHOW$GUI)
GUISetState(@SW_SHOW$GUIsub)

While 
1
    Sleep
(100)
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$hScrDC0$pSize$hMemDC$pSource0$pBlend$ULW_ALPHA)
    
_WinAPI_ReleaseDC(0$hScrDC)
    
_WinAPI_SelectObject($hMemDC$hOld)
    
_WinAPI_DeleteObject($hBitmap)
    
_WinAPI_DeleteDC($hMemDC)
EndFunc 
10/28/2010 20:38 omer36#9
Quote:
Originally Posted by eagly200 View Post
würde mich auch interresieren...
So könnte man auch ne Transparente Uhr programmieren.
geh mal in dein autoit ordner..---
C:\Program Files (x86)\AutoIt3\Examples\GUI\Advanced
da findeste eine Clock.au3...

10/28/2010 20:40 Mr. Pancake-Trader#10
@eagly200
Du brauchst erstmal ne Gui also Bilder wo der Zeiger an allen Stellen steht auser du machst 3 Bilder:
1, Ziffernblatt
2, Stundenzeiger
3, Minutenzeiger
evtl. 4, Sekundenzeiger

Dann lässt du diese Bilder einfach nur rotieren also des heißt so z.b:
Wenn eine Sekunde um ist drehe Sekundenzeiger um 1 Grad oder so ähnlich...

@Fuii
Du bist genial :D
Achja ich fang in den Ferien wieder mit AutoIt an will nur so n paar Sachen nochmal wissen bevor ich Anfang ^^

Greetz