Um im Listview die Zeilen abwechselnd zu färben werden mit GuiCtrlSetBkColor($Listview, COLOR_ODD) die Farbe für die ungeraden Zeilen bestimmt und das Setzen des Flag GUICtrlSetBkColor($Listview, $GUI_BKCOLOR_LV_ALTERNATE) ermöglicht dann bei der Erstellung der ListviewItem mit GuiCtrlSetBkColor($Listview, COLOR_EVEN) die Färbung der geraden Zeilen zu definieren.
Optisch gefällt mir an der Variante nicht, dass der gesamte Listviewhintergrund (auch ohne Dateninhalt) eingefärbt wird.
Zum anderen wäre es doch praktisch, die alternative Farbe automatisch zu bestimmen, wenn man keinen speziellen Wunsch hat. (Diese Möglichkeit habe ich in Nim entdeckt)
Ich habe das noch kombiniert mit der Berechnung der Farbe für den Text (Farbe für hellen oder dunklen Hintergrund), damit ein ausreichender Kontrast zum Lesen vorhanden ist. Gefärbt werden nun ausschließlich die mit Daten befüllten Item.
Vielleicht könnt ihr es brauchen.
EDIT: Da war noch ein Fehler drin. Durch die Berechnung entstanden Floatzahlen, die durch die Funktion Hex nicht verarbeitet werden können.
Zusätzlich wird jetzt ohne Angabe von Farben weiß/grau verwendet.
;-- TIME_STAMP 2022-09-29 16:01:46
#include <GUIConstantsEx.au3>
_AlternateColors_ByFlag()
_AlternateColors_EvenByUser()
_AlternateColors_EvenCalculated(0xEFE4B0)
_AlternateColors_EvenCalculated(0xFFD700)
_AlternateColors_EvenCalculated(0xDC143C)
_AlternateColors_EvenCalculated(0x00FF00)
_AlternateColors_EvenCalculated(0xA0A0A0)
_AlternateColors_EvenCalculated() ; ohne Angabe: weiß / grau
Func _AlternateColors_ByFlag()
Local $hGui = GUICreate('AlternateColors by Flag')
Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)
GUICtrlSetBkColor(-1, 0xEFE4B0) ; Color odd row
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
For $i = 1 To 30
GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
GUICtrlSetBkColor(-1, 0xC8BFE7) ; Color even row
Next
GUISetState()
Do
Until GUIGetMsg() = -3
GUIDelete($hGui)
EndFunc
Func _AlternateColors_EvenByUser()
Local $hGui = GUICreate('AlternateColors by User')
Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)
For $i = 1 To 30
GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
_LV_SetAlternateBkColor($i-1, 0xC8BFE7, 0xEFE4B0) ; color even, color odd - by user
Next
GUISetState()
Do
Until GUIGetMsg() = -3
GUIDelete($hGui)
EndFunc
Func _AlternateColors_EvenCalculated($_colorOdd=-1)
Local $hGui = GUICreate('AlternateColors Calculated')
Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)
For $i = 1 To 30
GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
_LV_SetAlternateBkColor($i-1, $_colorOdd) ; color odd, color even - calculated
Next
GUISetState()
Do
Until GUIGetMsg() = -3
GUIDelete($hGui)
EndFunc
Func _LV_SetAlternateBkColor($_Index, $_RGBodd=-1, $_RGBeven=-1, $_ColOnDark=-1, $_ColOnBright=-1)
$_RGBodd = $_RGBodd = -1 ? 0xFFFFFF : $_RGBodd
$_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
$_ColOnBright = $_ColOnBright = -1 ? 0x000088 : $_ColOnBright
Local $R, $G, $B
If Mod($_Index, 2) <> 0 Then
GUICtrlSetBkColor(-1, $_RGBodd)
Else
If $_RGBeven = -1 Then
$R = Int(0.8*BitAND(BitShift($_RGBodd, 16), 0xFF))
$G = Int(0.8*BitAND(BitShift($_RGBodd, 8), 0xFF))
$B = Int(0.8*BitAND($_RGBodd, 0xFF))
$_RGBeven = '0x' & Hex($R, 2) & Hex($G, 2) & Hex($B, 2)
EndIf
GUICtrlSetBkColor(-1, $_RGBeven)
EndIf
GUICtrlSetColor(-1, _RGB_GetContrast((Mod($_Index, 2) <> 0 ? $_RGBodd : $_RGBeven), $_ColOnDark, $_ColOnBright))
EndFunc
Func _RGB_GetContrast($_RGB, $_ColOnDark=0xFAFAFA, $_colOnBright=0x000088)
; get brightness
Local $R = BitAND(BitShift($_RGB, 16), 0xFF)
Local $G = BitAND(BitShift($_RGB, 8), 0xFF)
Local $B = BitAND($_RGB, 0xFF)
Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)
If $Brightness < 140 Then ; dark
Return $_ColOnDark ; contrast text color if background is dark
Else
Return $_colOnBright ; contrast text color if background is bright
EndIf
EndFunc
Alles anzeigen
Standard:
[_LV_SetAlternateBkColor] User setzt Farbe für odd und even:
[_LV_SetAlternateBkColor] User setzt nur Farbe für odd: