ListView - Flackern verhindern

  • Hi,
    gibt es eine Möglichkeit das flackern des ListViews zu verhindern :?:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $farbe1 = 0x00BFFF ;hellblau
    $farbe2 = 0xFFFF00 ;gelb
    $farbe3 = 0x00FF7F ;grün

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

    GUICreate("Test", 100, 400)

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

    $h_lv = GUICtrlCreateListView("Test", 10, 50, 70, 320, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
    GUICtrlSendMsg($h_lv, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($h_lv, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(10)
    _eintragen()
    WEnd

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

    Func _eintragen()
    _GUICtrlListView_BeginUpdate($h_lv)
    $wert = Random(0, 100, 1)
    $lv_zeile = GUICtrlCreateListViewItem($wert, $h_lv)
    If $wert < 33 Then
    $farbe = $farbe1
    ElseIf $wert > 66 Then
    $farbe = $farbe3
    Else
    $farbe = $farbe2
    EndIf
    GUICtrlSetBkColor($lv_zeile, $farbe)
    _GUICtrlListView_EndUpdate($h_lv)

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

    EndFunc ;==>_eintragen

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

    Func _beenden()
    Exit
    EndFunc ;==>_beenden

    [/autoit]

    Den Sleep-Wert will ich nur ungern erhöhen, da sonst das eintragen langsamer wird :S

    • Offizieller Beitrag

    gibt es eine Möglichkeit das flackern des ListViews zu verhindern


    In diesem Falle würde ich sagen: Nein.
    Denn da du ununterbrochen im Abstand von 10ms den Befehl zum Eintragen neu aufrufst ändert sich die Ansicht deines Listview in der Zeitspanne 10ms+Zeitaufwand_aus_der_Funktion (zw. 3 u. 30 ms), sodass du im schlechtesten Fall eine Frequenz von etwa 25Hz erreichst - deutliches Flackern.

    Grml - es gibt ja bei Listview den Ex-Style: $LVS_EX_DOUBLEBUFFER - der tuts. ;)

  • Unter Win 7 siehts auch ein bisschen anders aus (Umrandung beachten)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $farbe1 = 0x00BFFF ;hellblau
    $farbe2 = 0xFFFF00 ;gelb
    $farbe3 = 0x00FF7F ;grün
    $i = 0

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

    GUICreate("Test", 200, 800)

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

    $h_lv = GUICtrlCreateListView("Test", 10, 50, 170, 150, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER), $LVS_EX_DOUBLEBUFFER)
    GUICtrlSendMsg($h_lv, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($h_lv, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
    $h_lv2 = GUICtrlCreateListView("Test", 10, 220, 170, 150, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER))
    GUICtrlSendMsg($h_lv2, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT)
    GUICtrlSendMsg($h_lv2, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(10)
    If $i < 10 Then
    For $i = 1 To 100
    _eintragen($h_lv)
    _eintragen($h_lv2)
    Next
    EndIf
    WEnd

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

    Func _eintragen($h_lv_tmp)
    _GUICtrlListView_BeginUpdate($h_lv_tmp)
    $wert = Random(0, 100, 1)
    $lv_zeile = GUICtrlCreateListViewItem($wert, $h_lv_tmp)
    If $wert < 33 Then
    $farbe = $farbe1
    ElseIf $wert > 66 Then
    $farbe = $farbe3
    Else
    $farbe = $farbe2
    EndIf
    GUICtrlSetBkColor($lv_zeile, $farbe)
    _GUICtrlListView_EndUpdate($h_lv_tmp)
    EndFunc ;==>_eintragen

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

    Func _beenden()
    Exit
    EndFunc ;==>_beenden

    [/autoit]


    Auf dem Bild:
    oben mit $LVS_EX_DOUBLEBUFFER
    unten ohne $LVS_EX_DOUBLEBUFFER

    komisch :?::?::?: