Icons imGUI mit Mausklick UND HotKey bedienen

  • Halo Leute,

    nun sitze ich da schon ne weile dran.
    Ich habe ein GUI gebastelt und verwende dort mehrere Icons als Buttons. Beim Anklicken werden die Icons ausgetauscht (On/Off). Das ganze funktioniert auch super, aber leider nur wenn ich die Icons direkt anklicke. Wenn ich Hotkeys vergebe, wird bei deren Benutzung immer das zuletzt von der Maus angeklickte Icon verwendet. Ich weiß, dass das an dem @GUI_CtrlID-Makro liegt bzw. am @HotKeyPressed-Makro. Kann man den Abgleich was genau gedrückt wurde auch anders realisieren??? oder gibt es ne Möglichkeit die Makros zu resetten oder zu überschreiben?

    Spoiler anzeigen
    [autoit]

    Opt('GUIOnEventMode', 1)
    Dim $aIcon[6] = ["save.ico","save_no.ico","hide.ico","hide_no.ico","readonly.ico","readonly_no.ico"]
    Dim $pthIco = "C:\Users\me\Documents\Autoit\Prog\ico\"
    Global $aBlnIco[3]=[False,False,False]

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

    GUICreate("Test 1.0")
    GUISetOnEvent(-3, 'Close')

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

    $ok1 = GUICtrlCreateIcon($pthIco & $aIcon[1], -1, 35,35)
    GUICtrlSetOnEvent($ok1, '_ButtonClicked')
    HotKeySet("s", "_ButtonClicked")
    $ok2 = GUICtrlCreateIcon($pthIco & $aIcon[3], -1, 70,35)
    GUICtrlSetOnEvent($ok2, '_ButtonClicked')
    HotKeySet("h", "_ButtonClicked")
    $ok3 = GUICtrlCreateIcon($pthIco & $aIcon[5], -1, 105,35)
    GUICtrlSetOnEvent($ok3, '_ButtonClicked')
    HotKeySet("r", "_ButtonClicked")
    guisetstate()

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

    while 1*Sleep(1000)
    WEnd

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

    Func Close()
    Exit
    EndFunc

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

    Func _ButtonClicked()
    Switch @GUI_CtrlHandle
    Case ControlGetHandle("[active]", "", $ok1)
    OK($ok1, 0, 0)
    Case ControlGetHandle("[active]", "", $ok2)
    OK($ok2, 1, 2)
    Case ControlGetHandle("[active]", "", $ok3)
    OK($ok3, 2, 4)
    EndSwitch
    EndFunc

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

    Func OK($hIcon, $blnID, $intIconOn, $intIconOff = "" )
    If $intIconOff = "" Then $intIconOff = $intIconOn + 1
    If $aBlnIco[$blnID] Then
    GUICtrlSetImage($hIcon, $pthIco & $aIcon[$intIconOff])
    $aBlnIco[$blnID] = False
    Else
    GUICtrlSetImage($hIcon, $pthIco & $aIcon[$intIconOn])
    $aBlnIco[$blnID] = True
    EndIf
    EndFunc

    [/autoit]

    Vlt. könnte mir auch jmd einen neuen Ansatz verraten, stehe zZ voll auf dem Schlauch.

    • Offizieller Beitrag

    Ein anderer Ansatz (GUISetAccelerators statt Hotkey):

    Spoiler anzeigen
    [autoit]


    Opt('GUIOnEventMode', 1)
    Dim $aIcon[6] = ["save.ico", "save_no.ico", "hide.ico", "hide_no.ico", "readonly.ico", "readonly_no.ico"]
    Dim $pthIco = @ScriptDir & "\ico\" ; <- lieber keinen absoluten Pfad benutzen
    Global $aBlnIco[3] = [False, False, False]

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

    $hGui = GUICreate("Test 1.0")
    GUISetOnEvent(-3, 'Close')

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

    $ok1 = GUICtrlCreateIcon($pthIco & $aIcon[1], -1, 35, 35)
    GUICtrlSetOnEvent($ok1, '_ButtonClicked')
    $ok2 = GUICtrlCreateIcon($pthIco & $aIcon[3], -1, 70, 35)
    GUICtrlSetOnEvent($ok2, '_ButtonClicked')
    $ok3 = GUICtrlCreateIcon($pthIco & $aIcon[5], -1, 105, 35)
    GUICtrlSetOnEvent($ok3, '_ButtonClicked')
    GUISetState()
    Dim $aAccKey[3][2] = [["s", $ok1],["h", $ok2],["r", $ok3]]
    GUISetAccelerators($aAccKey, $hGui) ; <- besser als Hotkeys, weil man die Funktion nicht anpassen muss

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

    While 1 * Sleep(1000)
    WEnd

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

    Func Close()
    Exit
    EndFunc ;==>Close

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

    Func _ButtonClicked()
    Switch @GUI_CtrlId ; <- CtrlId liefert gleich die ID
    Case $ok1
    OK($ok1, 0, 0)
    Case $ok2
    OK($ok2, 1, 2)
    Case $ok3
    OK($ok3, 2, 4)
    EndSwitch
    EndFunc ;==>_ButtonClicked

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

    Func OK($hIcon, $blnID, $intIconOn, $intIconOff = "")
    If $intIconOff = "" Then $intIconOff = $intIconOn + 1
    If $aBlnIco[$blnID] Then
    GUICtrlSetImage($hIcon, $pthIco & $aIcon[$intIconOff])
    $aBlnIco[$blnID] = False
    Else
    GUICtrlSetImage($hIcon, $pthIco & $aIcon[$intIconOn])
    $aBlnIco[$blnID] = True
    EndIf
    EndFunc ;==>OK

    [/autoit]

    Edit: Die Funktion "_ButtonClicked" kann man auch noch kürzen:

    [autoit]


    Func _ButtonClicked()
    OK(@GUI_CtrlId, @GUI_CtrlId - $ok1, (@GUI_CtrlId - $ok1) * 2)
    ;~ Switch @GUI_CtrlId ; <- CtrlId liefert gleich die ID
    ;~ Case $ok1
    ;~ OK($ok1, 0, 0)
    ;~ Case $ok2
    ;~ OK($ok2, 1, 2)
    ;~ Case $ok3
    ;~ OK($ok3, 2, 4)
    ;~ EndSwitch
    EndFunc ;==>_ButtonClicked

    [/autoit]
  • Hallo Oscar,

    DANKE!
    Es hat funktioniert - genauso wie ich es mir gedacht hatte!
    Die Switch-Abfrage mit @GUI_CtrlID hatte ich erst drin, allerdings dachte ich, dass der Fehler vlt. aus dieser Ecke herrührt!
    Dann werde ich mir mal die

    [autoit]

    GUISetAccelerators()

    [/autoit]

    GUISetAccelerators-Funktion mal genauer anschauen.

    Schönes Wochenende

    der Strahleman :rock:

    Wenn denn alles so einfach wäre wie

    [autoit]

    "Autoit"

    [/autoit]

    meine UDFs
    Math2

    Wichtige Threads
    Math2

  • Oscar :
    Das nenn ich mal Optimum.
    Aber ichfrage mich warum ich da nicht selber drauf gekommen bin?
    Naja da ist es wieder: die Sache mit dem Wald und den Bäumen ;)

    Allerdings war das hier ja auch nur das Test-Script für mein etwas umfangreicheres Script, werdemal schauen, ob ich die Verkürzung auch dort unterbringen kann!

    Wenn denn alles so einfach wäre wie

    [autoit]

    "Autoit"

    [/autoit]

    meine UDFs
    Math2

    Wichtige Threads
    Math2

    • Offizieller Beitrag

    Noch nicht Optimum. ;)
    Es geht noch etwas kürzer:

    Spoiler anzeigen
    [autoit]


    Opt('GUIOnEventMode', 1)
    Dim $aIcon[6] = ["save.ico", "save_no.ico", "hide.ico", "hide_no.ico", "readonly.ico", "readonly_no.ico"]
    Dim $pthIco = @ScriptDir & "\ico\" ; <- lieber keinen absoluten Pfad benutzen
    Global $aBlnIco[3] = [True, True, True]

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

    $hGui = GUICreate("Test 1.0")
    GUISetOnEvent(-3, 'Close')

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

    $ok1 = GUICtrlCreateIcon($pthIco & $aIcon[1], -1, 35, 35)
    GUICtrlSetOnEvent($ok1, '_ButtonClicked')
    $ok2 = GUICtrlCreateIcon($pthIco & $aIcon[3], -1, 70, 35)
    GUICtrlSetOnEvent($ok2, '_ButtonClicked')
    $ok3 = GUICtrlCreateIcon($pthIco & $aIcon[5], -1, 105, 35)
    GUICtrlSetOnEvent($ok3, '_ButtonClicked')
    GUISetState()
    Dim $aAccKey[3][2] = [["s", $ok1],["h", $ok2],["r", $ok3]]
    GUISetAccelerators($aAccKey, $hGui) ; <- besser als Hotkeys, weil man die Funktion nicht anpassen muss

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

    While Sleep(1000)
    WEnd

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

    Func Close()
    Exit
    EndFunc ;==>Close

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

    Func _ButtonClicked()
    Local $iIndex = @GUI_CtrlId - $ok1
    $aBlnIco[$iIndex] = Not $aBlnIco[$iIndex]
    GUICtrlSetImage(@GUI_CtrlId, $pthIco & $aIcon[$iIndex * 2 + $aBlnIco[$iIndex]])
    EndFunc

    [/autoit]