;/ Label Problem

  • Hallo,

    ich habe immer noch das Problem, dass mein Label flackert, wenn es ständig den Text ändern soll.

    Es soll über ein Bild sein und nicht flackern. Mit GDI + ist das ja möglich, aber ich packe es damit noch nicht so ganz. ;/

    Geht das vielleicht auch ohne?

    Habe hier mal ein Skript, wo er ständig den Name wechselt :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Form1", 581, 437, 192, 124)
    $Pic1 = GUICtrlCreatePic(StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\msoobe.jpg"), 0, 0, 580, 436)
    $FastLabel = GUICtrlCreateLabel("test123", 136, 200, 237, 28)
    GuiCtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    $i = 1

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

    While 1
    $i += 1
    GuiCtrlSetData($FastLabel,"test" & $i)
    If GuiGetMsg() = $GUI_EVENT_CLOSE Then
    Exit
    EndIf
    WEnd

    [/autoit]

    Gibt es dafür vielt eine Lösung, sodass er nicht immer am Flackern ist? Die Hintergrundfarbe des Labels ist auf transparent gesetzt...

    Mfg, Julien

  • Ich sehe mehrere Probleme in deinem Script... Das Flackern liegt einfach daran, dass du das Label in einem gefühlten 10ms Intervall updatest. Das ist viiieel zu schnell, und lesen kann das so schnell eh keiner ;).
    Außerdem solltest du das Label nicht in der Hauptschleife mit GUIGetMsg verwalten, weil der Befehl bei Bedarf automatisch den Scriptablauf verzögert (wenn die Maus nicht innerhalb der GUI ist). Benutze lieber Adlibregister mit einem sinnvolleren Intervall (wie z.B. 100-200ms) und registrier damit eine extra Funktion die das mit dem Label übernimmt.

  • Generell ist so etwas mit Controls schlecht, aber da sích selbst kein GDI+ Gedöns kann, würde ich ne Pause im Scipt machen, denn zu schnelles Wechseln der Daten bringt das grundsätzlich zu wackeln


    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Form1", 581, 437, 192, 124)
    $Pic1 = GUICtrlCreatePic(StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\msoobe.jpg"), 0, 0, 580, 436)
    $FastLabel = GUICtrlCreateLabel("test123", 136, 200, 237, 28)
    GuiCtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    $i = 1

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

    $timer=TimerInit() ;Erstellt einen Timer
    While 1
    if TimerDiff($timer)>250 then ;Wenn die Zeit nach dem letzten Timer größerals 250ms ist, dann...
    $timer=TimerInit() ;Timer auf 0 setzen
    $i += 1
    GuiCtrlSetData($FastLabel,"test" & $i)
    Endif
    If GuiGetMsg() = $GUI_EVENT_CLOSE Then
    Exit
    EndIf
    WEnd

    [/autoit]
  • Tut mir leid, aber ich brauche es ohne AdlibRegister , darum geht es ja, dass er bei hoher Wechselgeschwindigkeit nicht flackert.

    UEZ hat mir dazu mal ein Beispiel gemacht, wie das mit GDI + geht, aber da ich bei solchen GDI + Angelegenheiten überhaupt nicht durchsteige, werde ich es warscheinlich auch nicht packen, mein ganzes Skript damit zu editieren. ;/

    @xXxProGramerxXx : Danke für die UDF , aber diese funktioniert leider nicht. Wenn ich die UDF benutze, dann wird die GUI nicht einmal richtig dargestellt.

    *Edit : Habe mir mal von dieser HTML Datei den Download gezogen und das Beispiel etwas bearbeitet, da ich es immer erst am Beispiel teste.

    Das Problem ist nun ,dass die Hintergrundfarbe nicht geändert werden kann mit dem UDF Befehl ??? Oder mache ich einen Fehler ?

    Bearbeitet :

    Spoiler anzeigen
    [autoit]

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

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

    _FlickerExample()
    _FlickerFreeExample()
    _FlickerExample2()
    _FlickerFreeExample2()

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

    Func _FlickerExample()

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

    #region ### START Koda GUI section ### Form=
    Local $hGUI = GUICreate("Flicker Example", 522, 193)
    Local $lb1 = GUICtrlCreateLabel("", 163, 16, 67, 17)
    Local $lb2 = GUICtrlCreateLabel("", 164, 40, 67, 17)
    Local $lb3 = GUICtrlCreateLabel("", 163, 64, 67, 17)
    Local $lb4 = GUICtrlCreateLabel("", 163, 88, 67, 17)
    Local $lb5 = GUICtrlCreateLabel("", 163, 112, 67, 17)
    Local $lb6 = GUICtrlCreateLabel("", 427, 16, 67, 17)
    Local $lb7 = GUICtrlCreateLabel("", 427, 40, 67, 17)
    Local $lb8 = GUICtrlCreateLabel("", 427, 64, 67, 17)
    Local $lb9 = GUICtrlCreateLabel("", 427, 88, 67, 17)
    Local $lb10 = GUICtrlCreateLabel("", 427, 112, 67, 17)
    Local $lb11 = GUICtrlCreateLabel("", 274, 142, 67, 17)
    Local $lb12 = GUICtrlCreateLabel("", 275, 166, 67, 17)
    GUICtrlCreateLabel("Title 1 =", 27, 16, 42, 17)
    GUICtrlCreateLabel("TitleABCE 3 =", 27, 40, 85, 17)
    GUICtrlCreateLabel("TitleAB 5 =", 27, 64, 118, 17)
    GUICtrlCreateLabel("Title 7 =", 27, 88, 42, 17)
    GUICtrlCreateLabel("Title 9 =", 27, 112, 42, 17)
    GUICtrlCreateLabel("TitleA 2 =", 291, 16, 42, 17)
    GUICtrlCreateLabel("TitleEFG 4 =", 291, 40, 85, 17)
    GUICtrlCreateLabel("TitleABC 6 =", 291, 64, 118, 17)
    GUICtrlCreateLabel("Title 8 =", 291, 88, 42, 17)
    GUICtrlCreateLabel("Title 10 =", 291, 112, 48, 17)
    GUICtrlCreateLabel("Title 11 =", 178, 142, 48, 17)
    GUICtrlCreateLabel("TitleABCE 12 =", 178, 166, 91, 17)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    Local $i = 10000
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Return
    Case Else
    $i += 1
    GUICtrlSetData($lb1, $i)
    GUICtrlSetData($lb2, $i)
    GUICtrlSetData($lb3, $i)
    GUICtrlSetData($lb4, $i)
    GUICtrlSetData($lb5, $i)
    GUICtrlSetData($lb6, $i)
    GUICtrlSetData($lb7, $i)
    GUICtrlSetData($lb8, $i)
    GUICtrlSetData($lb9, $i)
    GUICtrlSetData($lb10, $i)
    GUICtrlSetData($lb11, $i)
    GUICtrlSetData($lb12, $i)
    EndSwitch
    WEnd
    EndFunc ;==>_FlickerExample

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

    Func _FlickerFreeExample()
    Local $width = 521
    Local $hGUI = GUICreate("Flicker Free Example", $width, 193)
    $Pic1 = GUICtrlCreatePic(StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\msoobe.jpg"), 0, 0, 580, 436)
    Local $lb1 = _GUICtrlFFLabel_Create($hGUI, "", 1, 15, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb2 = _GUICtrlFFLabel_Create($hGUI, "", 1, 40, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb3 = _GUICtrlFFLabel_Create($hGUI, "", 1, 65, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb4 = _GUICtrlFFLabel_Create($hGUI, "", 1, 90, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb5 = _GUICtrlFFLabel_Create($hGUI, "", 1, 115, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb6 = _GUICtrlFFLabel_Create($hGUI, "", 1, 140, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    Local $lb7 = _GUICtrlFFLabel_Create($hGUI, "", 1, 165, $width, 17, 9, -1, -1, 3)
    _GUICtrlFFLabel_GUISetBkColor ($GUI_BKCOLOR_TRANSPARENT,-1)
    GUISetState(@SW_SHOW)

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

    Local $i = 10000
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Return
    Case Else
    $i += 1
    _GUICtrlFFLabel_SetData($lb1, StringFormat(' \tTitle 1 = \t\t%5d \t\t\tTitle 2 = \t\t%5d', $i, $i, $i))
    _GUICtrlFFLabel_SetData($lb2, StringFormat(' \tTitleABCD 3 = \t%5d \t\t\tTitleAB 3 = \t%5d', $i, $i, $i))
    _GUICtrlFFLabel_SetData($lb3, StringFormat(' \tTitle 4 = \t\t%5d \t\t\tTitleA 5 = \t%5d', $i, $i, $i))
    _GUICtrlFFLabel_SetData($lb4, StringFormat(' \tTitleABC 6 = \t%5d \t\t\tTitleAB 7 = \t%5d', $i, $i, $i))
    _GUICtrlFFLabel_SetData($lb5, StringFormat(' \tTitle 8 = \t\t%5d \t\t\tTitleABC 9 = \t%5d', $i, $i, $i))
    _GUICtrlFFLabel_SetData($lb6, StringFormat(' \t\t\t\tTitle 6 = \t\t%5d', $i))
    _GUICtrlFFLabel_SetData($lb7, StringFormat(' \t\t\t\tTitleABCDE 8 = \t%5d', $i))
    EndSwitch
    WEnd
    EndFunc ;==>_FlickerFreeExample

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

    Func _FlickerExample2()

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

    Local $Form1 = GUICreate("Flickering Labels", 409, 218)
    Local $Label1 = GUICtrlCreateLabel("Label 1 =", 80, 40, 55, 19)
    Local $Label2 = GUICtrlCreateLabel("Label 2 =", 80, 80, 55, 19)
    Local $Label3 = GUICtrlCreateLabel("Label 3 = ", 80, 120, 58, 19)
    Local $Label4 = GUICtrlCreateLabel("", 146, 40, 183, 19)
    Local $Label5 = GUICtrlCreateLabel("", 146, 80, 183, 19)
    Local $Label6 = GUICtrlCreateLabel("", 80, 120, 240, 17)
    GUISetFont(9, 200, 0, 'Microsoft Sans Serif')
    GUISetState(@SW_SHOW)

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

    Local $iCount
    While 1
    Switch GUIGetMsg()
    Case -3; $GUI_EVENT_CLOSE
    GUIDelete($Form1)
    Return
    Case Else
    GUICtrlSetData($Label4, Round(Random(1, 100000), 3))
    GUICtrlSetData($Label5, Random(1, 100000))
    GUICtrlSetData($Label6, 'Label 1 = ' & Random(1, 100000))
    EndSwitch
    WEnd
    EndFunc ;==>_FlickerExample

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

    Func _FlickerFreeExample2()

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

    Local $hGUI = GUICreate("Flicker Free Labels", 409, 218, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
    Local $button_move = GUICtrlCreateButton("Move", 90, 150, 113, 21)
    Local $button_delete = GUICtrlCreateButton("Delete", 220, 150, 113, 21)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)

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

    Local $Label1 = _GUICtrlFFLabel_Create($hGUI, "Label 1 ", 80, 40, 240, 17)
    Local $Label2 = _GUICtrlFFLabel_Create($hGUI, "Label Two", 80, 80, 240, 17, 9, 'Times', 1, 0, 0xFFFF0000)
    Local $Label3 = _GUICtrlFFLabel_Create($hGUI, "Label 3", 80, 120, 240, 17)
    Local $Label8 = _GUICtrlFFLabel_Create($hGUI, "Flicker Free", 140, 10, 129, 33, 16)

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

    GUISetState(@SW_SHOW)
    $bMove = 0
    While 1
    Switch GUIGetMsg()
    Case -3;$GUI_EVENT_CLOSE
    GUIDelete($hGUI)
    Return
    Case $button_delete
    _GUICtrlFFLabel_Delete($Label2)
    Case $button_move
    $bMove = BitXOR($bMove, 1);toggle
    If $bMove Then
    _GUICtrlFFLabel_Move($Label1, 20)
    Else
    _GUICtrlFFLabel_Move($Label1, 200)
    EndIf
    Case Else
    _GUICtrlFFLabel_SetData($Label1, "Label One = " & Random(1, 100000))
    _GUICtrlFFLabel_SetData($Label2, "Label Two = " & Random(1, 100000))
    _GUICtrlFFLabel_SetData($Label3, "Label Three = " & Random(1, 100000))
    EndSwitch
    WEnd

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

    EndFunc ;==>_FlickerFreeExample1

    [/autoit]


    Mfg, Julien

    Einmal editiert, zuletzt von Julien (24. Februar 2012 um 18:45)

  • Zitat

    Tut mir leid, aber ich brauche es ohne AdlibRegister , darum geht es ja, dass er bei hoher Wechselgeschwindigkeit nicht flackert.


    Dann musst du mal schauen ob du irgendwie etwas an dem Doublebuffersystem von Windows ändern kannst, oder das ganze dann doch mit GDI+ machen.
    Wieso willst du, dass das Label öfter aktualisiert wird, als das menschliche Auge/Gehirn erfassen kann? :huh:


  • Dann musst du mal schauen ob du irgendwie etwas an dem Doublebuffersystem von Windows ändern kannst, oder das ganze dann doch mit GDI+ machen.
    Wieso willst du, dass das Label öfter aktualisiert wird, als das menschliche Auge/Gehirn erfassen kann? :huh:

    Da ich so ein Tool geschrieben habe und bei dem Tool wird angezeigt, wv Zeilen editiert wurden und das Label ist über einem Hintergrund.

    Also das mit den FFLabels scheint doch zu laufen, aber die Hintergrundfarbe kann man nicht ändern oder habe ich etwas falsch gemacht?

    Habe es bei meinem letzten Post hinzugefügt.

  • nimm mal die gleiche hintergrund farbe wie bei der GUI und benutz mal:

    [autoit]

    _GUICtrlFFLabel_GUISetBkColor("farbcode")

    [/autoit]


    der befehl ersätzt jedes label mit der farbe, steht da

    Spoiler anzeigen
    [autoit]

    Func _GUICtrlFFLabel_GUISetBkColor($nBkColor, $hWnd = -1)
    If $hWnd = -1 Then $hWnd = $g_aGDILbs[$g_aGDILbs[0][0]][$g_FF_hGUI]
    GUISetBkColor($nBkColor, $hWnd)
    Local $iBGColor = __GUICtrlFFLabel_GetWindowBkColor($hWnd)
    For $i = 1 To $g_aGDILbs[0][0]
    If $g_aGDILbs[$i][$g_FF_hGUI] Then $g_aGDILbs[$i][$g_FF_iDef_BG_Color] = $iBGColor
    Next
    _GUICtrlFFLabel_Refresh()
    EndFunc ;==>_GUICtrlFFLabel_GUISetBkColor
    ;ist im include schon dabei

    [/autoit]

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Zitat

    Da ich so ein Tool geschrieben habe und bei dem Tool wird angezeigt, wv Zeilen editiert wurden und das Label ist über einem Hintergrund.


    ?(
    Wer kann mehr als 60 Zeilen in der Sekunde editieren.. Aktualisier das Label doch bei Bedarf, oder überprüfe einfach ob sich der Text überhaupt geändert hat mit einer simplen If-Abfrage. Das verhindert das Flackern genauso...

  • Ehh, was schreibe ich für ein Mist. tut mir leid, ich meinte eigtl nur , dass die Hintergrundfarbe nicht geändert werden kann, das funktioniert nicht ganz. ;/

  • Zitat

    da sich das Label jede Millisekunde ändern muss..


    Was aber gar nicht geht, weil AutoIt es niemals schafft den entsprechenden Wert in so kurzer Zeit zu ermitteln und dann in das Label zu kopieren. :rolleyes:
    Mich würde ja wirklich interessieren wieso das unbedingt so sein muss.. Kannst du mir evtl. sagen was genau das Label denn darstellen muss?

  • Ist doch egal, wv ein Mensch davon lesen kann ...

    Ich möchte doch nur noch die Hintergrundfarbe ändern, aber das funktioniert bei der UDF nicht ganz ..