GUI blinkt..

  • Ich schreib mir gerade ein SMS Programm soweit läuft auch alles nur haben ich das Problem das die Buttons und Labels so wiederlich blinken wie kann ich das beheben.

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include<file.au3>
    #include<array.au3>
    #include<ie.au3>
    #include<string.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("SMS Writer", 271, 301, 240, 144)
    GUISetBkColor(0xD4D0C8)
    $Nummer = GUICtrlCreateInput("Nummer:", 10, 10, 250, 20, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
    $Text = GUICtrlCreateEdit("", 10, 40, 250, 190, BitOR($ES_CENTER,$ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
    GUICtrlSetData(-1, "Text")
    $ButtonStart = GUICtrlCreateButton("Start", 10, 265, 100, 25, $WS_GROUP)
    $ButtonEnde = GUICtrlCreateButton("Ende", 160, 265, 100, 25, $WS_GROUP)
    $Zaehler = GUICtrlCreateLabel("0", 90, 240, 26, 17)
    $Label2 = GUICtrlCreateLabel("/ 160 Zeichen", 120, 240, 72, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1

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

    #region
    ;zählerausgabe
    $smslaenge = StringLen(GUICtrlRead($Text)) ;ließt länge des textes
    GUICtrlSetData($Zaehler, $smslaenge); gibt die länge in label aus

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

    If $smslaenge >= 160 Then ;wenn text über 160 setze zähler rotund blocke start
    GUICtrlSetColor($Zaehler, 0xff0000)
    GUICtrlSetState($ButtonStart,$GUI_DISABLE)
    EndIf
    If $smslaenge <= 160 Then; wenn text unter 160 setze alles wieder zurück
    GUICtrlSetColor($Zaehler, 0x000000)
    GUICtrlSetState($ButtonStart,$GUI_ENABLE)
    EndIf
    #endregion

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonEnde
    Exit

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

    Case $ButtonStart

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

    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von ManniMensen (2. Mai 2011 um 20:11)

  • Indem du deine Labels nur jede Sekunde aktualisieren lässt und dann auch nur, wenn sich etwas ändert.
    Ok, eine Sekunde ist wohl in diesem Fall zu viel, aber 100ms Pause können schon sein.

  • Das Flackern tritt auf, weil du in deiner Schleife permanent den Buttonstatus neu setzt und dein Label erneuerst obwohl vielleicht garkein Grund dafür vorliegt. Minimieren kannst du diesen Effekt indem du eine Pause in der Schleife einbaust, also zb. sleep(50). Sinnvoller wäre es aber wenn du anhand von if Abfragen prüfst ob sich überhaupt etwas geändert hat und nur dann das Label mit neuen Daten versorgst. Beim Button das selbe, nur etwas am Status ändern wenn notwendig.

  • Spoiler anzeigen
    [autoit]

    #region - Timestamp
    ;2011-05-02 20:12:18
    #endregion - Timestamp

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include<file.au3>
    #include<array.au3>
    #include<ie.au3>
    #include<string.au3>

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("SMS Writer", 271, 301, 240, 144)
    GUISetBkColor(0xD4D0C8)
    $Nummer = GUICtrlCreateInput("Nummer:", 10, 10, 250, 20, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    $Text = GUICtrlCreateEdit("", 10, 40, 250, 190, BitOR($ES_CENTER, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
    GUICtrlSetData(-1, "Text")
    $ButtonStart = GUICtrlCreateButton("Start", 10, 265, 100, 25, $WS_GROUP)
    $ButtonEnde = GUICtrlCreateButton("Ende", 160, 265, 100, 25, $WS_GROUP)
    $Zaehler = GUICtrlCreateLabel("4", 90, 240, 26, 17)
    $Label2 = GUICtrlCreateLabel("/ 160 Zeichen", 120, 240, 72, 17)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")

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

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

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $hCtrl = $lParam
    Local $hEdit = $Text
    If Not IsHWnd($hEdit) Then $hEdit = GUICtrlGetHandle($Text)
    ConsoleWrite($nNotifyCode & @CRLF)
    If ($nNotifyCode = 1024 Or $nNotifyCode = 786) And $hCtrl = $hEdit Then
    $smslaenge = StringLen(GUICtrlRead($Text))
    GUICtrlSetData($Zaehler, $smslaenge)
    If $smslaenge >= 160 And GUICtrlGetState($ButtonStart) = 80 Then ;wenn text über 160 setze zähler rotund blocke start
    GUICtrlSetColor($Zaehler, 0xff0000)
    GUICtrlSetState($ButtonStart, $GUI_DISABLE)
    EndIf
    If $smslaenge <= 160 And GUICtrlGetState($ButtonStart) = 144 Then; wenn text unter 160 setze alles wieder zurück
    GUICtrlSetColor($Zaehler, 0x000000)
    GUICtrlSetState($ButtonStart, $GUI_ENABLE)
    EndIf
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_COMMAND

    [/autoit]

    edit: Kleinen Fehler behoben. Jetzt sollte es klappen.