In diesem HowTo möchte ich euch zeigen, wie ihr eine
transparente
teilweise durchsichtige
verschiebbare
dauerhaft auf dem Desktop anzeigbare
Pop-Up
GUI erstellen könnt.
Zuerst suchen wir uns ein schönes Bild.gif:
Ich habe dort schon den Hintergrund eingefärbt. Eine Farbe wird nämlich nachher transparent gemacht.
Die Farbe hier ist 0x0CFF00. Bei jpg ändert sich aufgrund der Kompression der Farbwert, den wir für die Transparenz gesetzt haben. Deshalb verwenden wir *.gif.
Falls ihr in eurem Bild keine Farbe findet, die noch nicht benutzt wird, müsst ihr eine beliebige Farbe einfach um einen Farbwert verschieben, damit später nicht Teile des Bildes transparent werden (löchrig).
(Standard) vs
Kommen wir nun zum GUIOnEventMode.
Beispiel-Source
Ohne den GUIOnEventMode sieht es etwa so aus:
Code:
$GUI=GuiCreate(...
$Control1=GuiCtrlCreate(...
$Control2=GuiCtrlCreate(...
;...
$ControlN=Guictrlcreate(...
While 1
[COLOR="Green"][B] $nMsg = GUIGetMsg()
Switch $nMsg[/B][/COLOR]
Case $Control1
_Action1()
Case $Control2
_Action2()
Case $Control3
_Action3()
Case $Control4
_Action4()
Case $Control5
_Action5()
WEnd
Mit dem GUIOnEventMode sieht es z.B. so aus:
Code:
$GUI=GuiCreate(...
$Control1=GuiCtrlCreate(...
$Control2=GuiCtrlCreate(...
;...
$ControlN=Guictrlcreate(...
[COLOR="Green"][B]
For $i = $Control1 To $ControlN
GUICtrlSetOnEvent($i, '_Control_EVENT')
Next[/B][/COLOR]
While 1
sleep(10)
Wend
Func _Control_Event()
[COLOR="Green"] [B]Switch @GUI_CtrlId[/B][/COLOR]
Case $Control1
_Action1()
Case $Control2
_Action2()
Case $Control3
_Action3()
Case $Control4
_Action4()
Case $Control5
_Action5()
Case $Control6, $Control7, $Control8, $ControlN
_ActionN()
Endswitch
Endfunc
Die Codes sind im Aufbau fast genau gleich. Es kann für jedes Control eine eigene Funktion registriert werden, wie im Beispiel oben kann man aber auch für jedes Control dieselbe Funktion registrieren. Das spart uns sehr viel Platz und bewahrt die Übersichtlichkeit im Script.
Weitere Informationen dazu findet ihr
Erstellen wir uns jetzt eine GUI mit ein paar Buttons.
Das Bild ist 510px breit und 450px hoch, es wird zuerst erstellt, direkt nach GuiCreate. Andernfalls überdeckt es später Controls, die davor erstellt wurden. Das Bild dann noch deaktivieren.
Ein paar Buttons hinzufügen, ...
und den Code mit F9 exportieren.
Die GUI verwendet den Style $WS_POPUP (=kein Rand) und $WS_EX_LAYERED (=transparent)
So. Jetzt steht das da in der Mitte vom Desktop. Wir wollen die GUI aber auch verschieben können!
Dazu benötigen wir diese Funktion ():
Code:
Func _GUIDrag()
Local $hGUI = @GUI_WinHandle
Local $aCurInfo = GUIGetCursorInfo($hGUI)
If $aCurInfo[4] = 0 Then ; Mouse not over a control
DllCall("user32.dll", "int", "ReleaseCapture")
_SendMessage($hGUI, $WM_NCLBUTTONDOWN, $HTCAPTION, 0)
EndIf
EndFunc ;==>_GUIDrag
Code:
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_GUIDrag')
Bedeutet, wenn die linke Maustaste nach unten gedrückt wird (auf die GUI), wird die Funktion _GUIDrag aufgerufen. Diese Funktion sorgt dafür, dass wir die Popup GUI verschieben können.
Es funktioniert alles gut, aber wenn wir Windows+D (Desktop anzeigen) drücken, verschwindet unsere GUI.
Um das zu verhindern, prüfen wir mit _IsPressed, ob die beiden Tasten gedrückt wurden:
Code:
Func _RestoreOnDesktop()
If _IsPressed('5B', $hUser32DLL) And _IsPressed(44, $hUser32DLL) Then
GUISetState(@SW_HIDE, $FormEPVP)
GUISetState(@SW_SHOW, $FormEPVP)
EndIf
EndFunc ;==>_RestoreOnDesktop
Die Funktion registrieren wir noch mit Adlibregister, damit alle 250ms auf diese Tastendrücke überprüft wird.
Fertig.
Das Script mit Kommentaren:
Code:
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.8.1
Author: Achat
Script Function:
Transparent GUI Example.
#ce ----------------------------------------------------------------------------
#RequireAdmin ; Damit wir ShellExecute benutzen können
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <WinApi.au3>
Opt('GUIOnEventMode', 1) ;GUIOnEventMode aktivieren!
InetGet('http://i.epvpimg.com/gt6gd.gif',@ScriptDir&'\epvp.gif') ; Das Hintergrundbild herunterladen.
Global $hUser32DLL = DllOpen('user32.dll') ; DLL, die von _IsPressed benötigt wird, öffnen.
#region ### START Koda GUI section ### Form=
$FormEPVP = GUICreate("EPVP", 510, 450, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
GUISetFont(8, 400, 0, "Comic Sans MS")
$PicEPVP = GUICtrlCreatePic(@ScriptDir & "\epvp.gif", 0, 0, 510, 450)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton("OffTopic", 64, 96, 105, 25)
GUICtrlSetFont(-1, 10, 400, 0, "Arial Black")
$Button2 = GUICtrlCreateButton("News", 343, 96, 105, 25)
GUICtrlSetFont(-1, 10, 400, 0, "Arial Black")
$Button3 = GUICtrlCreateButton("AutoIt", 63, 163, 105, 25)
GUICtrlSetFont(-1, 10, 400, 0, "Arial Black")
$Button4 = GUICtrlCreateButton("UserCP", 343, 163, 105, 25)
GUICtrlSetFont(-1, 10, 400, 0, "Arial Black")
$Button5 = GUICtrlCreateButton("X", 488, 8, 17, 17)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
_WinAPI_SetLayeredWindowAttributes($FormEPVP, 0x0CFF00) ; Bildhintergrund transparent machen.
; GUI Events registrieren
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit') ; Wenn Taskleiste -> Rechtsklick -> Fenster schließen -> Funktion _Exit.
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_GUIDrag') ; Wenn Linksklick auf die GUI -> Funktion _GUIDrag aufrufen.
; Control Events registrieren
For $i = $Button1 To $Button5
GUICtrlSetOnEvent($i, '_Control_Event')
Next
AdlibRegister('_RestoreOnDesktop') ; Ruft die Funktion _RestoreOnDesktop alle 0.25 Sekunden auf. Falls wir Win+D drücken (Desktop anzeigen), stellt sich die GUI automatisch wieder in den Vordergrund.
; Nichts tun, damit Programm nicht ausgeht.
While 1
Sleep(10)
WEnd
;Funktion, die beim Klick auf ein Control eine Aktion ausführt.
Func _Control_Event()
Switch @GUI_CtrlId ;@GUI_CtrlId = ID des zuletzt geklickten Controls.
Case $Button5
Exit
Case $Button1
ShellExecute('http://www.elitepvpers.com/forum/off-topic/')
Case $Button2
ShellExecute('http://www.elitepvpers.com/forum/gaming-news/')
Case $Button3
ShellExecute('http://www.elitepvpers.com/forum/autoit/')
Case $Button4
ShellExecute('http://www.elitepvpers.com/forum/usercp.php')
EndSwitch
EndFunc ;==>_Control_Event
;Verschiebt unsere GUI
Func _GUIDrag()
Local $hGUI = @GUI_WinHandle
Local $aCurInfo = GUIGetCursorInfo($hGUI)
If $aCurInfo[4] = 0 Or $aCurInfo[4] = $PicEPVP Then ; Maus nicht über einem Control / Maus über dem Bild (auch transparenter Bereich).
DllCall("user32.dll", "int", "ReleaseCapture")
_SendMessage($hGUI, $WM_NCLBUTTONDOWN, $HTCAPTION, 0)
EndIf
EndFunc ;==>_GUIDrag
;Falls wir Win+D drücken, um zum Desktop zu wechseln, verhindert diese Funktion, dass die GUI versteckt wird.
Func _RestoreOnDesktop()
If _IsPressed('5B', $hUser32DLL) And _IsPressed(44, $hUser32DLL) Then ; Wenn die Taste Windows und D gedrückt ist.
GUISetState(@SW_HIDE, $FormEPVP)
GUISetState(@SW_SHOW, $FormEPVP)
EndIf
EndFunc ;==>_RestoreOnDesktop
;Beenden
Func _Exit()
DllClose($hUser32DLL) ; DLL, die von _IsPressed benötigt wird, schließen.
Exit
EndFunc ;==>_Exit
Fragen/Anregungen/Lob/Kritik/etc. sind immer willkommen.
Vielen dank hab schon lange auf so etwas gewartet
Aber mal ne Frage. Irre ich mich oder könnte man das Popup nicht einfach mit $WS_EX_CONTROLPARENT bewegen ?
[HowTo]Transparente Gildenlogos 10/16/2011 - Metin2 Guides & Templates - 4 Replies Hallo Com,
Einige von euch haben bestimmt schon mitbekommen, das einige Gilden in
Metin2 mit Gildenzeichen rumrennen, deren Hintergrund transparent
ist!!!!
Bis vor kurzen empfand ich es auch als kleines Highlight, da es natürlich so gut wie keiner hat
Jedoch finde ich, das der Server ruhig mal ein *klein Push* bekommen kann und
GUIOnEventMode AUtoIt Hilfe! 04/21/2010 - AutoIt - 2 Replies Hallo Leute,
ich bin gerade dabei mich in AutoIt einzulesen!
Jedoch habe ich ein kleines Probelm.
Ich leide das Script in einer Endlos Schleife und nach langem recherchieren habe ich herausgefunden dass das Programm in einer endlosschleife nicht mehr reagieren kann :(
Dann bin ich auf den GUIOnEventMode gestoßen.Es wurde beschrieben,dass man damit auch in solchen situationen das script noch steuern kann...jedoch wenn ich es einbaue weis ich nicht wo und es funktioniert auch nicht richtig :(...