GUI: Wie Element-Status verändern, ohne dass es zum Flackern kommt?

  • Hallo

    Ich hab grad dass erste mal mit GUIs zu tun und möchte gerne, dass einige Buttons nur dann aktiviert (also anklickbar) sind, wenn ein bestimmtes Programm geöffnet ist. Wird es geschlossen, sollen die Buttons wieder deaktiviert werden.

    Leider kommt es bei meiner Methode zu einem Flackern der betroffenen Buttons, weil diese während die GUI-Schleife läuft immerwieder auf aktiv- oder inaktiv gesetzt werden.

    Ich habe keine Idee, wie ich das umgehen kann. Ihr?

    Beispielcode:

    Spoiler anzeigen
    [autoit]

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

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

    $Form1 = GUICreate("Form1", 170, 41, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 73, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Flackerbutton", 88, 8, 73, 25, $WS_GROUP)
    GUICtrlSetState(-1,$GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    While 1

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

    If WinExists("[CLASS:Notepad]") Then
    GUICtrlSetState($Button2,$GUI_ENABLE)
    Else
    GUICtrlSetState($Button2,$GUI_DISABLE)
    EndIf

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

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

    [/autoit]

    Wie könnte man den Check nach - in diesem Fall Notepad - so gestalten, dass der rechte Button nicht permanent den Status gesetzt bekommt?

    Einmal editiert, zuletzt von klischee (25. Mai 2011 um 17:30)

  • Momentan wird dein Control bei jedem Durchlauf der While-schleife aktualisiert.
    Du solltest einen Buffer einbauen, so das das Control nur dann aktualisiert wird wenn sich auch etwas geändert hat. Also Notepad ist jetzt vorhanden oder das Notepad ist nichtmehr vorhanden.

    Hier mal meine Lösung.

    Spoiler anzeigen
    [autoit]

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

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

    $Form1 = GUICreate("Form1", 170, 41, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 73, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Flackerbutton", 88, 8, 73, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)
    Dim $iBuffer
    While 1
    $iState = WinExists("[CLASS:Notepad]")
    If $iBuffer <> $iState Then
    $iBuffer = $iState
    If $iBuffer Then
    GUICtrlSetState($Button2, $GUI_ENABLE)
    Else
    GUICtrlSetState($Button2, $GUI_DISABLE)
    EndIf
    EndIf

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

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

    [/autoit]

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

    • Offizieller Beitrag

    Man kann auch direkt den Status des Buttons abfragen:

    Spoiler anzeigen
    [autoit]


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

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

    $Form1 = GUICreate("Form1", 170, 41, 192, 124)
    $Button1 = GUICtrlCreateButton("Button1", 8, 8, 73, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Flackerbutton", 88, 8, 73, 25, $WS_GROUP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    While 1
    If WinExists("[CLASS:Notepad]") Then
    If BitAND(GUICtrlGetState($Button2), $GUI_DISABLE) Then GUICtrlSetState($Button2, $GUI_ENABLE)
    Else
    If BitAND(GUICtrlGetState($Button2), $GUI_ENABLE) Then GUICtrlSetState($Button2, $GUI_DISABLE)
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    BadBunny: Ein Sleep in der Schleife ist nicht nur falsch in Bezug auf die Lösung, sondern auch sehr hinderlich im Zusammenhang mit GUIGetMsg.

  • Beides coole Lösungen, auf letztere hätt ich auch selbst kommen können :pinch:

    Danke für die schnelle Hilfe!