Bild bei Mouseover verändern

  • Hi Leute.
    Ich habe schon ein fertiges Script, würde jetzt aber noch einfügen, dass er wenn der Benutzer die Maus auf pic2 oder pic3 bewegt jeweils ein anderes Bild anzeigt wird
    Mein Script:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Pic1 = GUICtrlCreatePic("S4logo.jpg", 0, 24, 249, 169, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic2 = GUICtrlCreatePic("buttons\button1up.JPG", 0, 0, 125, 26, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic3 = GUICtrlCreatePic("buttons\button2up.JPG", 125, 0, 125, 26, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]


    Ich habe schon ein Test-Script gefunden, weiß aber nicht wie ich das in mein Script einfüge:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    GUICreate("Test", 600, 400)
    $label = GUICtrlCreateLabel("test", 30, 150, 140, 30)
    GUISetState(@SW_SHOW)

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

    GUISetState ()

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

    Adlibregister("_Hover_Label")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _Hover_Label()
    $pos = GUIGetCursorInfo()
    If $pos[4] = $label Then
    GUICtrlSetBkColor($label, 0xFF0000)
    Else
    GUICtrlSetBkColor($label, Default)
    EndIf
    EndFunc

    [/autoit]


    Vielen Dank für eure Hilfe im Vorraus.
    Mfg Fliwatt

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $gui = GUICreate("")
    $Pic1 = GUICtrlCreatePic("desk.jpg", 0, 24, 249, 169, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $Pic2 = GUICtrlCreatePic("buttons\button1up.JPG", 0, 0, 125, 26, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $Pic3 = GUICtrlCreatePic("buttons\button2up.JPG", 125, 0, 125, 26, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    While 1
    _checkMousePos()
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(10)
    WEnd

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

    Func _checkMousePos()
    $pos = GUIGetCursorInfo()
    If IsArray($pos) Then
    If $pos[4] = $Pic1 Then
    ; Maus ist über pic1
    Else
    ; Maus ist nicht über pic1
    EndIf
    If $pos[4] = $Pic2 Then
    ; Maus ist über pic2
    Else
    ; Maus ist nicht über pic2
    EndIf
    If $pos[4] = $Pic3 Then
    ; Maus ist über pic3
    Else
    ; Maus ist nicht über pic3
    EndIf
    EndIf
    EndFunc ;==>_checkMousePos

    [/autoit]


    Du hast allerdings in deinem Skript noch gar keine GUI gehabt hab mal eine rein

    Und ganz wichtig:
    immer nen Sleep in ne endlosschleife sonst treibste die cpu bis an die kernschmelze ;)

    • Offizieller Beitrag


    Und ganz wichtig:
    immer nen Sleep in ne endlosschleife sonst treibste die cpu bis an die kernschmelze ;)

    Und gerade das ist völlig falsch. ;)
    Im MessageLoop-Modus ist ein Sleep nicht nur überflüssig (GUIGetMsg regelt die Prozessorauslastung), sondern kann sogar (wenn der Wert zu groß ist) zu einer Nichtbedienbarkeit der GUI führen.

    Nur im OnEventMode muss in der Endlosschleife ein Sleep rein, weil sonst ein Prozessorkern 100% erreicht.

  • Aha okay ist GuiGetMsg also so ne eierlegende wollmilchsau ^^
    Hab ich nicht gewusst, arbeite nur mit OnEvent gut zu wissen :)

  • Guten Morgen,

    es scheint sich immer noch nicht bis in den letzten Winkel herumgesprochen zu haben, aber ein Hovercheck ist nur dann erforderlich, wenn die Maus bewegt wird, und AutoIt ist so freundlich, uns genau darüber mit dem Event $GUI_EVENT_MOUSEMOVE zu informieren. Es braucht also weder AdlibRegister() noch unbedingte Funktionsaufrufe in der Messageloop, um das Hovern zu behandeln.

    In der Hoverfunktion sollte man sich außerdem merken, ob das Hovern über einem überwachten Coontrol bereits erkannt und die notwendige Aktion deshalb bereits ausgeführt wurde. Das vermeidet unnötige Aktionen und Flackereffekte. Dazu kann man eine statische Variable nutzen oder, wenn einem die Warnung zu abschreckend ist, auch globale.

    Ich habe das von Fliwatt ausgegrabene Beispiel auf mehrere Controls erweitert und auf die Auswertung von $GU_EVENT_MOUSEMOVE angepasst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    GUICreate("Test", 360, 190)
    GUISetBkColor(0x808080)
    $Label1 = GUICtrlCreateLabel("Label1", 30, 30, 300, 30, $SS_CENTER + $SS_CENTERIMAGE, $WS_EX_DLGMODALFRAME)
    GUICtrlSetBkColor(-1, 0xFF6060)
    $Label2 = GUICtrlCreateLabel("Label2", 30, 80, 300, 30, $SS_CENTER + $SS_CENTERIMAGE, $WS_EX_DLGMODALFRAME)
    GUICtrlSetBkColor(-1, 0x60FF60)
    $Label3 = GUICtrlCreateLabel("Label3", 30, 130, 300, 30, $SS_CENTER + $SS_CENTERIMAGE, $WS_EX_DLGMODALFRAME)
    GUICtrlSetBkColor(-1, 0x6060FF)
    GUISetState()

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

    GUISetState()

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

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

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

    Func _Check_Hover()
    Static $Hovered = False
    Local $aCursorInfo = GUIGetCursorInfo()
    If $Hovered And $Hovered <> $aCursorInfo[4] Then
    Switch $Hovered
    Case $Label1
    GUICtrlSetBkColor($Label1, 0xFF6060)
    Case $Label2
    GUICtrlSetBkColor($Label2, 0x60FF60)
    Case $Label3
    GUICtrlSetBkColor($Label3, 0x6060FF)
    EndSwitch
    $Hovered = False
    EndIf
    If Not $Hovered Then
    Switch $aCursorInfo[4]
    Case $Label1
    GUICtrlSetBkColor($aCursorInfo[4], 0xFFC0C0)
    $Hovered = $Label1
    Case $Label2
    GUICtrlSetBkColor($aCursorInfo[4], 0xC0FFC0)
    $Hovered = $Label2
    Case $Label3
    GUICtrlSetBkColor($aCursorInfo[4], 0xC0C0FF)
    $Hovered = $Label3
    EndSwitch
    EndIf
    EndFunc

    [/autoit]


    Möge es nützen! ;)

  • Bei mir klappt der Script immer noch nicht:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test", 251, 196, 240, 124)
    $Pic1 = GUICtrlCreatePic("pic.jpg", 0, 24, 249, 169, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic2 = GUICtrlCreatePic("buttons\button1up.JPG", 0, 0, 125, 26, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    $Pic3 = GUICtrlCreatePic("buttons\button2up.JPG", 125, 0, 125, 26, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS))
    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_MOUSEMOVE
    _Check_Hover()
    EndSwitch
    WEnd
    Func _Check_Hover()
    Static $Hovered = False
    Local $aCursorInfo = GUIGetCursorInfo()
    If $Hovered And $Hovered <> $aCursorInfo[4] Then
    Switch $Hovered
    Case $Pic2
    GUICtrlSetImage($Pic2,"buttons\button1hover.JPG")
    Case $Pic3
    GUICtrlSetImage($Pic3,"buttons\button2hover.JPG")
    EndSwitch
    $Hovered = False
    EndIf
    If Not $Hovered Then
    Switch $aCursorInfo[4]
    Case $Pic2
    GUICtrlSetImage($Pic2,"buttons\button1up.JPG")
    $Hovered = $Pic2
    Case $Pic3
    GUICtrlSetImage($Pic3,"buttons\button2up.JPG")
    $Hovered = $Pic3
    EndSwitch
    EndIf
    EndFunc

    [/autoit]
  • Funktioniert bei mir wunderbar hab nur den Pfad der Bilder an meine Beispielbilder angepasst.
    Bist du sicher dass die Bilder die du hast existieren und so heißen?

    Denn das Skript an sich ist völlig korrekt und funktioniert einwandfrei.
    Bis auf die Tatsache, dass $pic1 nicht abgeprüft wird aber vielleicht wolltest du das ja nicht :P

  • Funktioniert bei mir wunderbar hab nur den Pfad der Bilder an meine Beispielbilder angepasst.
    Bist du sicher dass die Bilder die du hast existieren und so heißen?

    Denn das Skript an sich ist völlig korrekt und funktioniert einwandfrei.
    Bis auf die Tatsache, dass $pic1 nicht abgeprüft wird aber vielleicht wolltest du das ja nicht :P


    Ja, das mit $pic1 ist absicht.
    Hatte einen Buchstaben zu viel in den Dateinamen ;)
    Copy & Paste Fehler!