Transparenz bei MouseOver switchen

    • Offizieller Beitrag

    Vermutlich existiert es schon in irgendeiner Form, ich hatte nur gerade nix gefunden, deshalb diese Variante von mir.
    In Abhängigkeit ob die Maus (nicht) über dem Fenster ist, wird die Transparenz zwischen 2 Werten geswitcht. Standardmäßig zwischen 150 und 255 (undurchsichtig).
    Falls ihr das Fenster beim Erstellen nicht auf Transparenz setzt, passiert das nach dem ersten Bewegen der Maus vom Fenster herunter automatisch.

    Edit 21.05.2012:
    Auf mehrfachen Wunsch einer einzelnen Dame :rofl: habe ich noch einen optionalen Parameter für einen "smoothigen" Übergang der Transparenz eingebaut.
    Einfach die Zeit in ms angeben und dann wird die Transparenz innerhalb dieser Zeitspanne schrittweise geändert. 500 ms ist eine recht "angenehme" Zeitspanne.

    Spoiler anzeigen
    [autoit]

    #Region - TimeStamp
    ; 2012-05-21 19:02:36
    #EndRegion - TimeStamp

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

    #include <WinAPI.au3>

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

    $hGUI = GUICreate('TEST')
    WinSetTrans($hGUI, '', 150)
    GUISetState()

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

    While True
    _TransOffByMouseOver($hGUI, -1, -1, 500) ; == letzter Parameter ist Zeit in ms für den Übergang der Transparenz
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    ;===============================================================================
    ; Function Name....: _TransOffByMouseOver
    ; Description......: Verändert Transparenz eines Fensters bei Maus über/nicht über Fenster
    ; Parameter(s).....: $_hGui Fensterhandle
    ; .................: $_iTrans Transparenz bei Maus nicht über Fenster (Standard 150)
    ; .................: $_iTransOff Transparenz bei Maus über Fenster (Standard 255, undurchsichtig)
    ; ........optional.: $_iTimeSmooth Zeit für den weichen Übergang der Transparenz in ms, Standard=0
    ; Requirement(s)...: #include <WinAPI.au3>
    ; Return Value(s)..: nichts
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _TransOffByMouseOver($_hGui, $_iTrans=-1, $_iTransOff=-1, $_iTimeSmooth=0)
    If $_iTrans = -1 Then $_iTrans = 150
    If $_iTrans < 0 Then $_iTrans = 0
    If $_iTransOff = -1 Then $_iTransOff = 255
    If $_iTransOff > 255 Then $_iTransOff = 255
    If $_iTimeSmooth < 0 Then $_iTimeSmooth = 0
    Local $tGui = _WinAPI_GetWindowRect($_hGui)
    Local $posMouse = MouseGetPos(), $iStep, $ret, $iCurr = $_iTrans, $timer
    Local Static $fTrans = True
    $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tGui), "long", $posMouse[0], "long", $posMouse[1])
    If $ret[0] Then
    If $fTrans Then
    $fTrans = False
    If $_iTimeSmooth > 0 Then
    $iStep = Ceiling(($_iTransOff-$_iTrans)/($_iTimeSmooth/10))
    While $iCurr < $_iTransOff
    $iCurr += $iStep
    If $iCurr > $_iTransOff Then
    WinSetTrans($_hGui, '', $_iTransOff)
    ExitLoop
    EndIf
    WinSetTrans($_hGui, '', $iCurr)
    $timer = TimerInit()
    Do
    Until TimerDiff($timer) >= 10
    WEnd
    Else
    WinSetTrans($_hGui, '', $_iTransOff)
    EndIf
    EndIf
    Else
    If Not $fTrans Then
    $fTrans = True
    If $_iTimeSmooth > 0 Then
    $iCurr = $_iTransOff
    $iStep = Ceiling(($_iTransOff-$_iTrans)/($_iTimeSmooth/10))
    While $iCurr > $_iTrans
    $iCurr -= $iStep
    If $iCurr < $_iTrans Then
    WinSetTrans($_hGui, '', $_iTrans)
    ExitLoop
    EndIf
    WinSetTrans($_hGui, '', $iCurr)
    $timer = TimerInit()
    Do
    Until TimerDiff($timer) >= 10
    WEnd
    Else
    WinSetTrans($_hGui, '', $_iTrans)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_TransOffByMouseOver

    [/autoit]
  • Da hat sich ein Fehler eingeschlichen in Zeile 41:

    [autoit]

    WinSetTrans($hGui, '', $_iTrans)

    [/autoit]


    sollte wohl eher

    [autoit]

    WinSetTrans($_hGui, '', $_iTrans)

    [/autoit]


    heissen

    MfG

    UNPLEASANT SPOILER

    You just lost the game!

  • Nein ist kein Fehler.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Nein ist kein Fehler.

    Dann probier's mal aus, indem du die GUI-Variable umbenennst...

    [autoit]

    Global $MeineGUI = GUICreate("test")

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

    _TransOffByMouseOver($MeineGUI)

    [/autoit]

    würde in dem Fall nicht funktionieren, wenn man aber das von mir angesprochene in der UDF ausbessert, dann funktioniert's

    MfG

    P.S.: Nichts desto trotz ne klasse Funktion!

    UNPLEASANT SPOILER

    You just lost the game!

  • Hatte deine Zeilenangabe nicht gelesen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke,
    jedoch funktioniert es nicht zu 100%.
    Gibt mal bei dir als Zeit 2000 ein.
    Dann funktionierts nicht mehr.

    Habs mal umgebaut

    Spoiler anzeigen
    [autoit]

    #region - TimeStamp
    ; 2012-05-21 19:02:36
    #endregion - TimeStamp

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

    #include <WinAPI.au3>

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

    ;~ Opt("TrayIconDebug", 1) ; 0=keine Info, 1=Debug Zeileninfo

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

    $hGUI = GUICreate('TEST')
    WinSetTrans($hGUI, '', 150)
    GUISetState()

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

    While True
    _TransOffByMouseOver($hGUI, -1, -1, 2000) ; == letzter Parameter ist Zeit in ms für den Übergang der Transparenz
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    ;===============================================================================
    ; Function Name....: _TransOffByMouseOver
    ; Description......: Verändert Transparenz eines Fensters bei Maus über/nicht über Fenster
    ; Parameter(s).....: $_hGui Fensterhandle
    ; .................: $_iTrans Transparenz bei Maus nicht über Fenster (Standard 150)
    ; .................: $_iTransOff Transparenz bei Maus über Fenster (Standard 255, undurchsichtig)
    ; ........optional.: $_iTimeSmooth Zeit für den weichen Übergang der Transparenz in ms, Standard=0
    ; Requirement(s)...: #include <WinAPI.au3>
    ; Return Value(s)..: nichts
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================

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

    Func _TransOffByMouseOver($_hGui, $_iTrans = -1, $_iTransOff = -1, $_iTimeSmooth = 0)
    If $_iTrans = -1 Then $_iTrans = 150
    If $_iTrans < 0 Then $_iTrans = 0
    If $_iTransOff = -1 Then $_iTransOff = 255
    If $_iTransOff > 255 Then $_iTransOff = 255
    If $_iTimeSmooth < 0 Then $_iTimeSmooth = 0
    Local $tGui = _WinAPI_GetWindowRect($_hGui)
    Local $posMouse = MouseGetPos(), $iStep, $ret, $iCurr = $_iTrans, $timer
    Local Static $fTrans = True
    $ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tGui), "long", $posMouse[0], "long", $posMouse[1])
    If $ret[0] Then
    If $fTrans Then
    $fTrans = False
    If $_iTimeSmooth > 0 Then
    $zeit = $_iTimeSmooth / ($_iTransOff - $_iTrans)
    $iCurr = $_iTrans
    While $iCurr < $_iTransOff
    $iCurr += 1
    WinSetTrans($_hGui, '', $iCurr)
    $timer = TimerInit()
    Do
    Until TimerDiff($timer) >= $zeit
    WEnd
    Else
    WinSetTrans($_hGui, '', $_iTransOff)
    EndIf
    EndIf
    Else
    If Not $fTrans Then
    $fTrans = True
    If $_iTimeSmooth > 0 Then
    $zeit = $_iTimeSmooth / ($_iTransOff - $_iTrans)
    $iCurr = $_iTransOff
    While $iCurr > $_iTrans
    $iCurr -= 1
    WinSetTrans($_hGui, '', $iCurr)
    $timer = TimerInit()
    Do
    Until TimerDiff($timer) >= $zeit
    WEnd
    Else
    WinSetTrans($_hGui, '', $_iTrans)
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_TransOffByMouseOver

    [/autoit]

    Willst du es so übernehmen?

  • Habs nochmal getestet, mit Ceiling ist es zu schnell.
    Man darf weder Int noch Ceiling hinschreiben, dann klappts