GUI per Maus einblenden

  • Hi,
    ich habe eine GUI (ganz oben am Bildschirm, leicht rechts versetzt).

    Folgendes will ich machen:
    Bleibe ich mit der Maus min. 1 Sekunden oben (Y=0) stehen, so wird die GUI eingeblendet.
    Vorrausetzung ist, dass ich in x-Richtung innerhalb der GUI bin.

    Ist die GUI sichtbar soll diese wieder verschwinden, wenn die Maus sich min. 1 Sekunde ausserhalb der GUI befindet.

    Dies hört sich im ersten Moment einfach an, ich meine jedoch dass es sich in sich hat.
    Momentan funktioniert das meiste. Wenn ich jedoch kürzer als 1 Sekunde ob auf Y=0 stehen bleibe, erscheint die GUI trotzdem ?(

    Kann natürlich auch sein. dass ich auf dem Schlauch stehe und das alles viel einfacher geht :P


    Spoiler anzeigen
    [autoit]

    #Region ;************ Includes ************
    #Include <WindowsConstants.au3>
    #EndRegion ;************ Includes ************

    [/autoit] [autoit][/autoit] [autoit]

    Global $gui_breite = 600
    Global $gui_hoehe = 60
    Global $gui_oben = 0
    Global $gui_oben_beginn = $gui_oben - $gui_hoehe + 5
    Global $gui_pos = (@DesktopWidth - $gui_breite) / 2 + 300
    Global $gui_beginn = $gui_pos
    Global $gui_ende = $gui_beginn + $gui_breite
    Global $titel = "Test123"

    [/autoit] [autoit][/autoit] [autoit]

    Global $h_gui = GUICreate($titel, $gui_breite, $gui_hoehe, $gui_pos, $gui_oben_beginn, $WS_POPUP, $WS_EX_ACCEPTFILES)

    [/autoit] [autoit][/autoit] [autoit]

    Global $begin = 999999999 ;Beginn Dummy
    Global $begin_xxx = $begin ;

    [/autoit] [autoit][/autoit] [autoit]

    Global $einblenden = 0 ;einblenden aktivieren
    Global $ausblenden = 0 ;ausblenden aktivieren
    Global $status = 0 ;0 = ausgeblendet / 1 = eingeblendet
    Global $hoehe_grenze = 0 ;Y-Koordinate zum einblenden
    Global $zeitgrenze = 1000 ;1 Sekunde bis zum ein- bzw. ausblenden
    Global $mouse_pos, $aktiviert

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    $mouse_pos = MouseGetPos()

    [/autoit] [autoit][/autoit] [autoit]

    If $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] = $hoehe_grenze Then
    If $status = 0 Then
    If $einblenden = 0 Then
    $einblenden = 1
    $begin = TimerInit()
    $ausblenden = 0
    $aktiviert = 1
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 And $mouse_pos[1] <= $gui_hoehe Then
    If $status = 1 Then
    $ausblenden = 0
    $einblenden = 0
    $begin = $begin_xxx
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $mouse_pos[0] < $gui_beginn Or $mouse_pos[0] > $gui_ende Or $mouse_pos[1] > $hoehe_grenze Then
    If $status = 1 Then
    If $ausblenden = 0 Then
    $ausblenden = 1
    $begin = TimerInit()
    $einblenden = 0
    $aktiviert = 1
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 And $status = 1 Then
    If $status = 0 Then
    $ausblenden = 0
    $einblenden = 0
    $begin = $begin_xxx
    $hoehe_grenze = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $aktiviert = 1 Then
    If TimerDiff($begin) > $zeitgrenze Then
    If $einblenden = 1 And $status = 0 Then
    WinMove($titel, "", Default, $gui_oben, Default, 50)
    $status = 1
    $einblenden = 0
    $hoehe_grenze = $gui_hoehe
    ElseIf $ausblenden = 1 And $status = 1 Then
    WinMove($titel, "", Default, $gui_oben_beginn)
    $status = 0
    $ausblenden = 0
    $hoehe_grenze = 0
    EndIf
    EndIf
    EndIf
    WEnd

    [/autoit]
  • Wenn ich das richtig sehe, dann setzt du die Variable $aktiviert auf 1 sobald die Maus innerhalb des "Einblenderamens" ist. Wenn $aktiviert nach 1 Sekunde immer noch den Wert 1 hat, wird die GUI eingeblendet.
    Aber wenn der Mauszeiger den festgelegten Bereich verlässt, dann müsstest du natürlich auch $aktiviert wieder zurücksetzen, sonst wird der Vorgang in jedem Fall ausgeführt.

    Hab ich das so richtig verstanden bis jetzt?

  • Ich vermute mal, dass der Timer nicht resetet wird wenn man ausserhalb des einblenden Bereichs ist. Dadurch wird wenn er einmal aktiviert ist die gui immer nach 1 Sekunde eingeblendet. Habs mir aber auch nicht genau angesehen. Ich persönlcih finde 1 Sekunde Wartezeit aber ohnehin eher lästig/unnötig, lass sie doch einfach sofort Ein- bzw. Ausblenden.

    Kleine Anmerkung zu der Art und Weise des Ausblendens:

    Du bekommst so ggf. Probleme bei Multimonitor Setups, das Problem hatte ich mal mit meiner Sidebar GUI. Da du das Fenster oben hast ist es aber eher unwahrscheinlich, dass jemand den sekundären Monitor darüber aufgebaut hat, bei Links oder Rechts platzierten Sidebars ist es hingegen eher kritish die GUI in den negativen Bereich zu verschieben. Ich mache das bei mir deshalb mit zwei GUIs, die eine schmal, welche immer am Rand sichtbar ist und die andere normalbreit. Das Ein und Ausblenden wird dann durch GUI Transparenz geregelt. Die Breite wird schrittweise immer mehr sichtbar, die schmale wird zeigleich transparent und letzlich komplett ausgeblendet. Multimonitor Problem behoben. ;)

  • name22
    Das hast du richtig verstanden. Nur weiß ich mittlerweile nicht mehr wo ich es hinschreiben soll ;(

    misterspeed
    Ja mit dem Timer habe ich ein Problem. Wobei das wenn dich GUI da ist und ich für weniger als 1 Sekunde die GUI verlasse bleibt sie erhalten.
    Nur beim einblenden wird sie trotzdem eingeblendet.
    Denke auch, dass es eher unwahrscheinlich ist, dass jemand einen Monitor darübersetzt. Aber dennoch danke für den Hinweis.

  • Ich würd das mit dem Timer etwa so lösen, allerdings ungetestet und nur schnell hier im Forum geschrieben, evtl ist auch ein Denkfehler drin...


    EDIT: erstmal entfernt, irgendwas war falsch ^^

    2 Mal editiert, zuletzt von misterspeed (7. April 2013 um 00:28)

  • Irgendwie vertrage ich mich gar nicht mit deinem Grundkonstrukt... :S Ich habe jetzt mal ein funktionierendes Beispiel zusammengeschustert. Die Funktionsweise ist geringfügig anders, dafür läuft das ganze wesentlich zuverlässiger und effizienter. ;)
    Ich bin von der direkten Überwachung der Mausposition auf die TrackMouseEvent Funktion aus der WinAPIEx umgestiegen. So werden einfach nach dem festgelegten Intervall die entsprechenden Funktionen per Event aufgerufen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #Include <APIConstants.au3>
    #include <WinAPI.au3>
    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; - Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    $iGUI_Width = 400 ;GUI Breite
    $iGUI_Height = 100 ;GUI Höhe

    [/autoit] [autoit][/autoit] [autoit]

    $iMinHeight = 10 ;Größe des sichtbaren Teils der GUI (wenn sie versteckt ist)
    $iGUI_XPos = @DesktopWidth / 2 + 300 ;X-Position der GUI
    $iGUI_YPos = $iMinHeight - $iGUI_Height ;Y-Position der GUI

    [/autoit] [autoit][/autoit] [autoit]

    $iHovertime = 1000 ;Zeit (in ms) die der Zeiger über dem Fenster verbringen muss, bis es eingeblendet wird
    $iSpeed = 5 ;Geschwindigkeit der Einblendung
    $bSliding = False

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Slide in/out", $iGUI_Width, $iGUI_Height, $iGUI_XPos, $iGUI_YPos, $WS_POPUP)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_TrackMouseEvent($hGUI, BitOR($TME_HOVER, $TME_LEAVE), $iHovertime)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
    GUIRegisterMsg($WM_MOUSEHOVER, "WM_MOUSEHOVER")
    GUIRegisterMsg($WM_MOUSELEAVE, "WM_MOUSELEAVE")

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)
    _WinAPI_TrackMouseEvent($hGUI, BitOR($TME_HOVER, $TME_LEAVE), $iHovertime)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSEHOVER($hWnd, $iMsg, $wParam, $lParam)
    If Not $bSliding Then
    $bSliding = True
    AdlibRegister("_GUISlide", 20)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSELEAVE($hWnd, $iMsg, $wParam, $lParam)
    If $bSliding Then
    $bSliding = False
    AdlibUnRegister("_GUISlide")
    $iGUI_YPos = $iMinHeight - $iGUI_Height
    _WinAPI_SetWindowPos($hGUI, $HWND_TOP, $iGUI_XPos, $iGUI_YPos, 0, 0, $SWP_NOSIZE)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GUISlide()
    If Not $bSliding Then Return
    If $iGUI_YPos < 0 Then
    $iGUI_YPos += $iSpeed
    ElseIf $iGUI_YPos > 0 Then
    $iGUI_YPos = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetWindowPos($hGUI, $HWND_TOP, $iGUI_XPos, $iGUI_YPos, 0, 0, $SWP_NOSIZE)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_TrackMouseEvent
    ; Description....: Posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.
    ; Syntax.........: _WinAPI_TrackMouseEvent ( $hWnd, $iFlags [, $iTime] )
    ; Parameters.....: $hWnd - Handle to the window to track.
    ; Return values..: $iFlags - The services requested. This parameter can be a combination of the following values.
    ;
    ; $TME_CANCEL
    ; $TME_HOVER
    ; $TME_LEAVE
    ; $TME_NONCLIENT
    ; $TME_QUERY
    ;
    ; $iTime - The hover time-out (if $TME_HOVER was specified in $Flags), in milliseconds. Can be (-1), which
    ; means to use the system default hover time-out.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Matt Diesel (Mat)
    ; Modified.......: Yashied
    ; Remarks........: None
    ; Related........:
    ; Link...........: @@MsdnLink@@ TrackMouseEvent
    ; Example........: Yes
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinAPI_TrackMouseEvent($hWnd, $iFlags, $iTime = -1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tTME = DllStructCreate('dword;dword;hwnd;dword')

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tTME, 1, DllStructGetSize($tTME))
    DllStructSetData($tTME, 2, $iFlags)
    DllStructSetData($tTME, 3, $hWnd)
    DllStructSetData($tTME, 4, $iTime)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ret = DllCall('user32.dll', 'int', 'TrackMouseEvent', 'ptr', DllStructGetPtr($tTME))

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_TrackMouseEvent

    [/autoit]

    Edit: Ich habe gerade herausgefunden, dass die kürzlich besprochene TrackMouseEvent Schwäche unter AutoIt auch hier einen Strich durch die Rechnung macht... :thumbdown:
    Falls du Controls in diese GUI einbauen willst, dann ist diese Lösung wohl nichts für dich, dann bricht der Slideoutvorgang nämlich ab sobald der Mauszeiger irgendein Control berührt. :(

  • Ich versuche gerade dein Code zu verstehen.
    Bitte hilf mir dabei ^^

    Warum machst du an einigen Stellen $begin = $begin_xxx?

    Ich beziehe mich auf diese Frage auf folgendes:
    Warum verwendest du ausgerechnet die Zahl 9999999?

  • name22
    es liest sich alles so einfach wenn man deine Lösung sieht :thumbup:
    Mit GUIRegisterMsg kann ich leider nicht viel anfangen, wenn ich etwas selber schreibe.

    Bei deinem Bsp. verschwand leider die GU sofort wieder.
    Ich es erweitert, dass man min. 1 Sekunde außerhalb der GUI sein muss, dass dies passiert.
    Wie findest du diese Erweiterung?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <APIConstants.au3>
    #include <WinAPI.au3>
    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; - Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    $iGUI_Width = 400 ;GUI Breite
    $iGUI_Height = 100 ;GUI Höhe

    [/autoit] [autoit][/autoit] [autoit]

    $iMinHeight = 10 ;Größe des sichtbaren Teils der GUI (wenn sie versteckt ist)
    $iGUI_XPos = @DesktopWidth / 2 + 300 ;X-Position der GUI
    $iGUI_YPos = $iMinHeight - $iGUI_Height ;Y-Position der GUI

    [/autoit] [autoit][/autoit] [autoit]

    $iHovertime = 1000 ;Zeit (in ms) die der Zeiger über dem Fenster verbringen muss, bis es eingeblendet wird
    $iSpeed = 5 ;Geschwindigkeit der Einblendung
    $bSliding = False

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Slide in/out", $iGUI_Width, $iGUI_Height, $iGUI_XPos, $iGUI_YPos, $WS_POPUP)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_TrackMouseEvent($hGUI, BitOR($TME_HOVER, $TME_LEAVE), $iHovertime)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_MOUSEMOVE, "WM_MOUSEMOVE")
    GUIRegisterMsg($WM_MOUSEHOVER, "WM_MOUSEHOVER")
    GUIRegisterMsg($WM_MOUSELEAVE, "WM_MOUSELEAVE")

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSEMOVE($hWnd, $iMsg, $wParam, $lParam)
    AdlibUnRegister("_GUIHide")
    _WinAPI_TrackMouseEvent($hGUI, BitOR($TME_HOVER, $TME_LEAVE), $iHovertime)
    EndFunc ;==>WM_MOUSEMOVE

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSEHOVER($hWnd, $iMsg, $wParam, $lParam)
    AdlibUnRegister("_GUIHide")
    If Not $bSliding Then
    $bSliding = True
    AdlibRegister("_GUISlide", 20)
    EndIf
    EndFunc ;==>WM_MOUSEHOVER

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_MOUSELEAVE($hWnd, $iMsg, $wParam, $lParam)
    AdlibRegister("_GUIHide", $iHovertime)
    EndFunc ;==>WM_MOUSELEAVE

    [/autoit] [autoit][/autoit] [autoit]

    Func _GUISlide()
    If Not $bSliding Then Return
    If $iGUI_YPos < 0 Then
    $iGUI_YPos += $iSpeed
    ElseIf $iGUI_YPos > 0 Then
    $iGUI_YPos = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetWindowPos($hGUI, $HWND_TOP, $iGUI_XPos, $iGUI_YPos, 0, 0, $SWP_NOSIZE)
    EndFunc ;==>_GUISlide

    [/autoit] [autoit][/autoit] [autoit]

    Func _GUIHide()
    If $bSliding Then
    $bSliding = False
    AdlibUnRegister("_GUISlide")
    $iGUI_YPos = $iMinHeight - $iGUI_Height
    _WinAPI_SetWindowPos($hGUI, $HWND_TOP, $iGUI_XPos, $iGUI_YPos, 0, 0, $SWP_NOSIZE)
    EndIf
    EndFunc ;==>_GUIHide

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_TrackMouseEvent
    ; Description....: Posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time.
    ; Syntax.........: _WinAPI_TrackMouseEvent ( $hWnd, $iFlags [, $iTime] )
    ; Parameters.....: $hWnd - Handle to the window to track.
    ; Return values..: $iFlags - The services requested. This parameter can be a combination of the following values.
    ;
    ; $TME_CANCEL
    ; $TME_HOVER
    ; $TME_LEAVE
    ; $TME_NONCLIENT
    ; $TME_QUERY
    ;
    ; $iTime - The hover time-out (if $TME_HOVER was specified in $Flags), in milliseconds. Can be (-1), which
    ; means to use the system default hover time-out.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Matt Diesel (Mat)
    ; Modified.......: Yashied
    ; Remarks........: None
    ; Related........:
    ; Link...........: @@MsdnLink@@ TrackMouseEvent
    ; Example........: Yes
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinAPI_TrackMouseEvent($hWnd, $iFlags, $iTime = -1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $tTME = DllStructCreate('dword;dword;hwnd;dword')

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tTME, 1, DllStructGetSize($tTME))
    DllStructSetData($tTME, 2, $iFlags)
    DllStructSetData($tTME, 3, $hWnd)
    DllStructSetData($tTME, 4, $iTime)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Ret = DllCall('user32.dll', 'int', 'TrackMouseEvent', 'ptr', DllStructGetPtr($tTME))

    [/autoit] [autoit][/autoit] [autoit]

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_TrackMouseEvent

    [/autoit]

    @Make-Grafik
    Ich weiß dies sieht doof aus. Ich habe nicht mehr weiterwusst und wollte so den Timer auf eine hohe Zahl erhöhen, damit dieser einen Minuswert ausgibt.
    Glaube ich steht da momentan aufm Schlauch. War heute wohl doch zu lang.
    Denke aber name22 hat wohl die perfekte Lösung schon gepostet.
    Dies hat dann soweit funktioniert.

  • Deine Erweiterung sieht in Ordnung aus, wenn es funktioniert passts doch ^^.
    Es würde mich ja wirklich freuen, dir geholfen zu haben, aber ich hoffe du hast dir auch meinen Edit noch durchgelesen. Mir ist nämlich gerade aufgefallen, dass diese Lösung eine nervige Schwachstelle hat die zum Teil mit AutoIt zusammenhängt.

  • Ja du hast mir geholfen.
    Ich habe mich schon gewundert, warum die GUI verschwindet,wenn ich über ein Control fahre.

    Dann habe ich erst deinen Edit gelesen.
    Also heißt dies, dass deine Lösung in diesem Mal nicht funktioniert, da ich auch Controls in der GUI habe?

    Heißt dies, dass ich wieder zurück zu meinem Skript vom 1. Post gehen muß?

  • Fürs erste wird das wohl so sein, ja.. Mir fällt gerade leider auch kein cleverer kleiner Hack ein um das zu umgehen. Bis jemand eine Lösung für dieses Problem mit TrackMouseEvent findet bleibt mein Beispiel wohl für dich nutzlos, tut mir leid.
    Allerdings ist das auch so zu schaffen. Meine version hätte das zwar enorm vereinfacht, aber das geht auch ohne TrackMouseEvent ;).

  • Trotzdem Danke.
    So habe nun doch noch was hinbekommen.
    Würdet ihr damit einverstanden sein :?::D

    Spoiler anzeigen
    [autoit]

    #region ;************ Includes ************
    #include <WindowsConstants.au3>
    #endregion ;************ Includes ************

    [/autoit] [autoit][/autoit] [autoit]

    Global $gui_breite = 600
    Global $gui_hoehe = 60
    Global $gui_oben = 0
    Global $gui_oben_beginn = $gui_oben - $gui_hoehe + 5
    Global $gui_pos = (@DesktopWidth - $gui_breite) / 2 + 300
    Global $gui_beginn = $gui_pos
    Global $gui_ende = $gui_beginn + $gui_breite
    Global $titel = "Test123"

    [/autoit] [autoit][/autoit] [autoit]

    Global $h_gui = GUICreate($titel, $gui_breite, $gui_hoehe, $gui_pos, $gui_oben_beginn, $WS_POPUP, $WS_EX_ACCEPTFILES)

    [/autoit] [autoit][/autoit] [autoit]

    Global $einblenden = 0 ;einblenden aktivieren
    Global $ausblenden = 0 ;ausblenden aktivieren
    Global $status = 0 ;0 = ausgeblendet / 1 = eingeblendet
    Global $zeitgrenze = 1000 ;1 Sekunde bis zum ein- bzw. ausblenden
    Global $mouse_pos, $begin

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    $mouse_pos = MouseGetPos()

    [/autoit] [autoit][/autoit] [autoit]

    If $status = 0 And $einblenden = 0 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] = 0 Then
    $begin = TimerInit()
    $einblenden = 1

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 0 And $einblenden = 1 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 Then
    $einblenden = 0

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 1 And $ausblenden = 0 And ($mouse_pos[0] < $gui_beginn Or $mouse_pos[0] > $gui_ende Or $mouse_pos[1] > $gui_hoehe) Then
    $begin = TimerInit()
    $ausblenden = 1

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 1 And $ausblenden = 1 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 And $mouse_pos[1] <= $gui_hoehe Then
    $begin = TimerInit()
    $ausblenden = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ConsoleWrite($status & @tab & TimerDiff($begin) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If TimerDiff($begin) > $zeitgrenze Then
    If $einblenden = 1 And $status = 0 Then
    WinMove($titel, "", Default, $gui_oben, Default, 50)
    $status = 1
    $einblenden = 0
    ElseIf $ausblenden = 1 And $status = 1 Then
    WinMove($titel, "", Default, $gui_oben_beginn)
    $status = 0
    $ausblenden = 0
    EndIf
    EndIf
    WEnd

    [/autoit]
  • Sieht doch ganz schick aus ^^

    Aufgefallen ist mir, dass beim ersten starten man am oberen Bildschirmrand ca. 5px breit einen "Strich" sieht, sofern man allerdings den GUI 1x eingeblendet hat und dann wieder ausblenden lässt ist dieser auch weg. Ansonsten ist es halt nicht 100% flüssig, allerdings habe ich bisher noch keine ähnliche Animation in AutoIt flüssig gesehen, also schließe ich mal das es nicht deine Schuld ist :P

    Grüße

    Grüße Yaerox

    Grüne Hölle

  • YaeroxXO
    Nun ist der 5 Pixel breite Strich immer zu sehen

    Spoiler anzeigen
    [autoit]

    #region ;************ Includes ************
    #include <WindowsConstants.au3>
    #endregion ;************ Includes ************

    [/autoit] [autoit][/autoit] [autoit]

    Global $gui_breite = 600
    Global $gui_hoehe = 60
    Global $gui_oben = 0
    Global $gui_oben_beginn = $gui_oben - $gui_hoehe + 5
    Global $gui_pos = (@DesktopWidth - $gui_breite) / 2 + 300
    Global $gui_beginn = $gui_pos
    Global $gui_ende = $gui_beginn + $gui_breite
    Global $titel = "Test123"

    [/autoit] [autoit][/autoit] [autoit]

    Global $h_gui = GUICreate($titel, $gui_breite, $gui_hoehe, $gui_pos, $gui_oben_beginn, $WS_POPUP, $WS_EX_ACCEPTFILES)

    [/autoit] [autoit][/autoit] [autoit]

    Global $einblenden = 0 ;einblenden aktivieren
    Global $ausblenden = 0 ;ausblenden aktivieren
    Global $status = 0 ;0 = ausgeblendet / 1 = eingeblendet
    Global $zeitgrenze = 1000 ;1 Sekunde bis zum ein- bzw. ausblenden
    Global $mouse_pos, $begin

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    $mouse_pos = MouseGetPos()

    [/autoit] [autoit][/autoit] [autoit]

    If $status = 0 And $einblenden = 0 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] = 0 Then
    $begin = TimerInit()
    $einblenden = 1

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 0 And $einblenden = 1 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 Then
    $einblenden = 0

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 1 And $ausblenden = 0 And ($mouse_pos[0] < $gui_beginn Or $mouse_pos[0] > $gui_ende Or $mouse_pos[1] > $gui_hoehe) Then
    $begin = TimerInit()
    $ausblenden = 1

    [/autoit] [autoit][/autoit] [autoit]

    ElseIf $status = 1 And $ausblenden = 1 And $mouse_pos[0] >= $gui_beginn And $mouse_pos[0] <= $gui_ende And $mouse_pos[1] > 0 And $mouse_pos[1] <= $gui_hoehe Then
    $begin = TimerInit()
    $ausblenden = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ ConsoleWrite($status & @tab & TimerDiff($begin) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If TimerDiff($begin) > $zeitgrenze Then
    If $einblenden = 1 And $status = 0 Then
    WinMove($titel, "", Default, $gui_oben, Default, $gui_hoehe)
    $status = 1
    $einblenden = 0
    ElseIf $ausblenden = 1 And $status = 1 Then
    WinMove($titel, "", Default, $gui_oben_beginn)
    $status = 0
    $ausblenden = 0
    EndIf
    EndIf
    WEnd

    [/autoit]