dynamisch farbiger Spalteninhalt im Listview

  • Hallo,

    ich habe eine dynamisch erstelltes Listview mit einer Spalte für den Status der Server online/offline

    ist es möglich, dass Online in GRÜN und OFFLINE in rot dargestellt wird?

    BSP:

    [autoit]


    $Form1 = GUICreate("Form1", 195, 123, 339, 251)
    $ListView1 = GUICtrlCreateListView("Server|Status", 8, 8, 177, 105)
    GUICtrlSendMsg(-1, 0x101E, 0, 50)
    GUICtrlSendMsg(-1, 0x101E, 1, 50)
    $ListView1_0 = GUICtrlCreateListViewItem("Server1|online", $ListView1)
    $ListView1_1 = GUICtrlCreateListViewItem("Server2|online", $ListView1)
    $ListView1_2 = GUICtrlCreateListViewItem("Server3|offline", $ListView1)
    GUISetState(@SW_SHOW)

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

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

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

    EndSwitch
    WEnd

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

    Danke für die Antworten ... ^^

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

    Einmal editiert, zuletzt von ctec (15. Januar 2009 um 08:18)

  • Du kannst dir auch sicher eine Funktion daraus erstellen. Die ganze Zeile einfärben ist am einfachsten:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    $Form1 = GUICreate("Form1", 195, 123, 339, 251)
    $ListView1 = GUICtrlCreateListView("Server|Status", 8, 8, 177, 105)
    GUICtrlSendMsg(-1, 0x101E, 0, 50)
    GUICtrlSendMsg(-1, 0x101E, 1, 50)
    $ListView1_0 = GUICtrlCreateListViewItem("Server1|online", $ListView1)
    If StringInStr (GUICtrlRead($ListView1_0), 'offline') Then
    GUICtrlSetBkColor(-1, 0xff0000)
    Else
    GUICtrlSetBkColor(-1, 0x00ff00)
    EndIf
    $ListView1_1 = GUICtrlCreateListViewItem("Server2|online", $ListView1)
    If StringInStr (GUICtrlRead($ListView1_1), 'offline') Then
    GUICtrlSetBkColor(-1, 0xff0000)
    Else
    GUICtrlSetBkColor(-1, 0x00ff00)
    EndIf
    $ListView1_2 = GUICtrlCreateListViewItem("Server3|offline", $ListView1)
    If StringInStr (GUICtrlRead($ListView1_2), 'offline') Then
    GUICtrlSetBkColor(-1, 0xff0000)
    Else
    GUICtrlSetBkColor(-1, 0x00ff00)
    EndIf
    GUISetState(@SW_SHOW)

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

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

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

    EndSwitch
    WEnd

    [/autoit]
  • Spoiler anzeigen
    [autoit]

    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #Include <GuiConstantsEx.au3>
    #Include <GuiListView.au3>

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

    ;fonts for custom draw example
    ;bold
    Global $aFont1 = DLLCall("gdi32.dll","int","CreateFont", "int", 14, "int", 0, "int", 0, "int", 0, "int", 700, _
    "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, _
    "dword", 0, "str", "")
    ;italic
    Global $aFont2 = DLLCall("gdi32.dll","int","CreateFont", "int", 14, "int", 0, "int", 0, "int", 0, "int", 400, _
    "dword", 1, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, _
    "dword", 0, "str", "")

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

    $GUI = GUICreate("Listview Custom Draw", 400, 300)

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

    $cListView = GUICtrlCreateListView("", 2, 2, 394, 268, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    $hListView = GUICtrlGetHandle($cListView)

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

    _GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
    _GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)

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

    ; Add items
    For $i = 1 To 30
    _GUICtrlListView_AddItem($hListView, "Row" & $i & ": Col 1", $i-1)
    For $j = 1 To 2
    _GUICtrlListView_AddSubItem ($hListView, $i-1, "Row" & $i & ": Col " & $j+1, $j)
    Next
    Next

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

    GUICtrlCreateInput("", 50, 275, 100, 15)

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUISetState()

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    DLLCall("gdi32.dll","int","DeleteObject", "hwnd", $aFont1[0])
    DLLCall("gdi32.dll","int","DeleteObject", "hwnd", $aFont2[0])
    Exit

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

    Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR

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

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hListView
    Switch $iCode
    Case $NM_CUSTOMDRAW
    If Not _GUICtrlListView_GetViewDetails($hWndFrom) Then Return $GUI_RUNDEFMSG
    Local $tCustDraw = DllStructCreate('hwnd hwndFrom;int idFrom;int code;' & _
    'dword DrawStage;hwnd hdc;long rect[4];dword ItemSpec;int ItemState;dword Itemlparam;' & _
    'dword clrText;dword clrTextBk;int SubItem;' & _
    'dword ItemType;dword clrFace;int IconEffect;int IconPhase;int PartID;int StateID;long rectText[4];int Align', _ ;winxp or later
    $lParam), $iDrawStage, $iItem, $iSubitem, $hDC, $tRect, $iColor1, $iColor2, $iColor3
    $iDrawStage = DllStructGetData($tCustDraw, 'DrawStage')
    Switch $iDrawStage
    Case $CDDS_PREPAINT
    Return $CDRF_NOTIFYITEMDRAW
    Case $CDDS_ITEMPREPAINT
    Return $CDRF_NOTIFYSUBITEMDRAW
    Case $CDDS_ITEMPOSTPAINT
    Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
    $iItem = DllStructGetData($tCustDraw, 'ItemSpec')
    $iSubitem = DllStructGetData($tCustDraw, 'SubItem')
    If _GUICtrlListView_GetItemSelected($hWndFrom, $iItem) Then
    $hDC = _WinAPI_GetDC($hWndFrom)
    $tRect = DllStructCreate('long;long;long;long')
    If $iSubitem = 0 Then
    DllCall('user32.dll','int','SendMessage', 'hwnd',$hWndFrom, 'uint',$LVM_GETSUBITEMRECT, 'wparam',$iItem, 'lparam',DllStructGetPtr($tRect))
    DllStructSetData($tRect, 1, 2)
    DllCall('user32.dll', 'int', 'FillRect', 'ptr', $hDC, 'ptr', DllStructGetPtr($tRect), 'int', _WinAPI_GetStockObject(4))
    EndIf
    DllStructSetData($tRect, 1, 2)
    DllStructSetData($tRect, 2, $iSubitem)
    DllCall('user32.dll','int','SendMessage', 'hwnd',$hWndFrom, 'uint',$LVM_GETSUBITEMRECT, 'wparam',$iItem, 'lparam',DllStructGetPtr($tRect))
    Local $sText = _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubitem)
    DLLCall("gdi32.dll","int","SetTextColor", "ptr", $hDC, "int", RGB2BGR(0xffff00))
    DLLCall("gdi32.dll","int","SetBkMode", "ptr", $hDC, "int", 1)
    DllStructSetData($tRect, 1, DllStructGetData($tRect, 1)+2)
    _WinAPI_DrawText($hDC, $sText, $tRect, 0x8000) ;; $DT_END_ELLIPSIS
    _WinAPI_ReleaseDC($hWndFrom, $hDC)
    Return $CDRF_SKIPDEFAULT
    EndIf
    Switch $iItem
    Case 0 To 9 ;for rows 1-10 lets do this
    $iColor1 = RGB2BGR(0xFBFFD8)
    $iColor2 = RGB2BGR(-1)
    $iColor3 = RGB2BGR(0xFF0000)
    If Mod($iSubitem, 2) Then ;odd columns
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)
    DllStructSetData($tCustDraw, 'clrText', 0)
    Else ;even columns
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)
    DllStructSetData($tCustDraw, 'clrText', $iColor3)
    EndIf
    Case 10 To 19 ;for rows 11-20 lets do this
    $iColor1 = RGB2BGR(0xFBFFD8)
    $iColor2 = RGB2BGR(0x3DF8FF)
    $hDC = DllStructGetData($tCustDraw, 'hdc')
    If Mod($iItem, 2) Then
    If Mod($iSubitem, 2) Then
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)
    Else
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)
    EndIf
    DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aFont1[0]) ;select our chosen font into DC
    Else
    If Mod($iSubitem, 2) Then
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)
    Else
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)
    EndIf
    DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aFont2[0])
    EndIf
    Case 20 To 29 ;for rows 21-30 lets do this
    $iColor1 = RGB2BGR(0xFBFFD8)
    $iColor2 = RGB2BGR(-1)
    If Mod($iItem, 2) Then ;odd rows
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)
    Else
    DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)
    EndIf
    EndSwitch
    Return $CDRF_NEWFONT
    Case BitOR($CDDS_ITEMPOSTPAINT, $CDDS_SUBITEM)
    Case Else
    EndSwitch
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func RGB2BGR($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
    EndFunc

    [/autoit]


    Das Beispiel funktioniert. Ich hab lediglich Includes und Konstanten der Quelle korrigiert.
    Quelle

  • besten Dank! Variante 1 werde ich wohl schnell hinbekommen - die 2. erfordert glaub ich etwas mehr arbeit :)

    8o

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • genau das will ich ja - einfärben wäre in dem Fall die "Notlösung" nur die Textfarbe wäre die "Lösung" ;)

    ich kriegs schon irgendwie hin :wacko:

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"