ListView

  • Hi,
    ich würde gerne in einer ListView in ganz bestimmten Feldern die Textfarbe ändern,
    also nicht ne komplette Spalte.
    Hat jemand eine Idee wie das funktioniert ? Oder geht das vielleicht gar nicht ?

    Markus

    Einmal editiert, zuletzt von bordermax (26. August 2014 um 15:51)

  • Also sowas wie in einem Kalender wenn ein tag noch frei ist dann grün ansonsten rot, sowas?

    Hab hier einen Code aus dem Englischen Forum der dir weiterhelfen wird:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <WindowsConstants.au3>
    #include <ColorConstants.au3>

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

    Opt("GUICloseOnESC", 0) ; ESC does not close GUI
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    Opt('MustDeclareVars', 1)
    OnAutoItExitRegister("Event_GUIClose")
    Opt("GUIEventOptions", 1) ;0=default, 1=just notification, 2=GuiCtrlRead tab index

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

    Global $mainWin_hWnd, $listView_hWnd, $listView_ID, $colorButton_hWnd, $colorButton_ID
    Global $aMasterList[6], $aColors[4]

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

    _Main()
    ExitStageLeft(0)

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; _Main() - Main function
    ;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Main()

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

    createMainWin()
    createListView()
    createColorButton()
    createMasterList()
    setupColorsArray()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "Event_GUIClose")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUICtrlSetOnEvent($colorButton_ID, "handle_Color_btn")

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

    GUISetState()

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

    loadListView() ; importand to do this after registering WM_NOTIFY events

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

    While 1
    Sleep(500)
    WEnd

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

    EndFunc ;==>_Main

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

    Func ExitStageLeft($ret)
    Exit ($ret)
    EndFunc ;==>ExitStageLeft

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

    Func Event_GUIClose()
    ExitStageLeft(1)
    EndFunc ;==>Event_GUIClose

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

    Func createMainWin()
    $mainWin_hWnd = GUICreate("Test2", 250, 200, -1, -1, BitOR($WS_CAPTION, $WS_SIZEBOX))
    ConsoleWrite("+++: $mainWin_hWnd = " & $mainWin_hWnd & @CRLF)
    if ($mainWin_hWnd == 0) Then exit (1)
    EndFunc ;==>createMainWin

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

    Func createListView()
    $listView_ID = GUICtrlCreateListView("", 10, 10, 230, 160, $LVS_REPORT)
    $listView_hWnd = GUICtrlGetHandle($listView_ID)

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

    _GUICtrlListView_InsertColumn($listView_hWnd, 0, "Color#+Name", 120)
    _GUICtrlListView_InsertColumn($listView_hWnd, 1, "Ax", 50)
    _GUICtrlListView_InsertColumn($listView_hWnd, 2, "Bx", 50)
    EndFunc ;==>createListView

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

    Func createColorButton()
    $colorButton_ID = GUICtrlCreateButton("Bump row 3's color", 10, 170, 100, 30)
    $colorButton_hWnd = GUICtrlGetHandle($colorButton_ID)
    EndFunc ;==>createColorButton

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

    Func createMasterList()
    $aMasterList[0] = "Name1|A1|B1~0"
    $aMasterList[1] = "Name2|A2|B2~1"
    $aMasterList[2] = "Name3|A3|B3~2"
    $aMasterList[3] = "Name4|A4|B4~0"
    $aMasterList[4] = "Name5|A5|B5~1"
    $aMasterList[5] = "Name6|A6|B6~2"
    EndFunc ;==>createMasterList

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

    Func loadListView()
    Local $item, $parts, $colornum, $str, $iIndex, $hWnd
    $hWnd = $listView_hWnd

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

    _GUICtrlListView_DeleteAllItems($hWnd)

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

    _GUICtrlListView_BeginUpdate($hWnd)

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

    For $item In $aMasterList
    $parts = StringSplit($item, "~") ; split the item from the colornum
    $item = $parts[1]
    $colornum = $parts[2]

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

    $parts = StringSplit($item, "|") ; break up the item into parts
    $str = StringFormat("(%d) ", $colornum) & $parts[1] ; prefix with the colornum
    $iIndex = _GUICtrlListView_AddItem($hWnd, $str, -1, $colornum)
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $parts[2], 1)
    _GUICtrlListView_AddSubItem($hWnd, $iIndex, $parts[3], 2)
    Next

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

    _GUICtrlListView_EndUpdate($hWnd)
    EndFunc ;==>loadListView

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

    Func setupColorsArray()
    $aColors[0] = RGB2BGR($COLOR_BLACK) ; 0x000000 - Normal
    $aColors[1] = RGB2BGR($COLOR_RED) ; 0xFF0000 - Secure
    $aColors[2] = RGB2BGR($COLOR_BLUE) ; 0x0000FF - CNS
    $aColors[3] = RGB2BGR($COLOR_YELLOW) ; 0xFFFF00 - Other
    EndFunc ;==>setupColorsArray

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

    Func RGB2BGR($iColor)
    Local $sH = Hex($iColor, 6)
    Return '0x' & StringRight($sH, 2) & StringMid($sH, 3, 2) & StringLeft($sH, 2)
    EndFunc ;==>RGB2BGR

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; WM_NOTIFY(0 - Handle the WM_NOTIFY event
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam, $ilParam
    Local $hWndFrom, $iCode, $tNMHDR
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $listView_hWnd
    Switch $iCode
    Case $NM_CUSTOMDRAW
    Local $iDrawStage, $tCustDraw
    $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam)
    $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage')
    Switch $iDrawStage
    Case $CDDS_ITEMPREPAINT ; 0x00010001
    setItemColor($tCustDraw, $hWndFrom)
    Return $CDRF_NOTIFYSUBITEMDRAW
    EndSwitch
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func setItemColor($tCustDraw, $hWnd)
    Local $iIndex, $color, $colornum

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

    $iIndex = DllStructGetData($tCustDraw, 'dwItemSpec')
    $colornum = _GUICtrlListView_GetItemParam($hWnd, $iIndex)
    $color = $aColors[$colornum]

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

    DllStructSetData($tCustDraw, 'clrText', $color)
    EndFunc ;==>setItemColor

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

    Func handle_Color_btn()
    Local $item, $parts

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

    $item = $aMasterList[2]
    $parts = StringSplit($item, "~") ; split the item from the colornum
    $parts[2] += 1
    $parts[2] = Mod($parts[2], 4)
    $item = $parts[1] & "~" & $parts[2]
    $aMasterList[2] = $item
    loadListView()
    EndFunc ;==>handle_Color_btn

    [/autoit]
  • philipp

    also ich komme nicht ganz klar mit Deinem Beispielscript.
    Vielleicht gebe ich einfach mal ein paar Codezeilen vor ...

    [autoit]


    ;*** GUI definieren
    $hGUIShow = GUICreate("ListView ...",1040,300,-1,-1,-1,-1)
    $hListView = GUICtrlCreatelistview("Spalte1|Spalte2|Spalte3|Spalte4",10,50,500,150,-1,$LVS_EX_SNAPTOGRID)
    $hButton = GUICtrlCreateButton("Ok",400,230,50,30,-1,-1)
    GUISetState(@SW_SHOW,$hGUIShow)
    ;*** ListView befüllen
    GUICtrlCreateListViewItem("Eintrag1|Eintrag2|Eintrag3|Eintrag4", $hListView)
    ;***

    [/autoit]

    So, wie bekomme ich es jetzt hin daß zum Beispiel" Eintrag4" (Text) grün dargestellt wird oder wenn das nicht funtioniert das die ganze Zeile ("Eintrag1 - Eintrag4")
    grün dargestellt wird ?

  • Also so kannst du auf jeden fall mal die ganze zeile farbig machen.. aber das denke ich ist bekannt!

    *EDIT: Für die jeweiligen SubItems hab ich jetzt noch was anderes gefunden! Hier im deutschen Forum von BugFix: https://autoit.de/index.php?page=Thread&amp;threadID=10104

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GUIListView.au3>

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

    main()
    Func main()
    GUICreate("ListView ...", 520, 210)
    GUISetFont(10)
    $list = GUICtrlCreatelistview("Spalte1|Spalte2|Spalte3|Spalte4", 10, 10, 500, 150, -1, $LVS_EX_SNAPTOGRID)
    $ok = GUICtrlCreateButton("Ok", 210, 170, 100, 30, -1, -1)
    GUISetState()

    GUICtrlCreateListViewItem("Eintrag1|Eintrag2|Eintrag3|Eintrag4", $list)
    GUICtrlSetColor(-1, 0x00AA00)

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

    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Or $msg = $ok Then
    Exit
    EndIf
    WEnd
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von philipp (26. August 2014 um 15:03)

  • Hi,

    ja das mit der Zeile war bekannt.

    Die UDF von Bugfix hab ich auch schon gefunden. Hab's auch ausprobiert bekomme aber ne Fehlermeldung.
    Ich denke ich mache da was falsch. Habe Bugfix ne Nachricht geschrieben, mal sehen ...
    Trotzdem Danke !

    Markus

  • PN an BugFix widerspricht irgendwie den Forengedanken.
    Warum postest du nicht einfach das Script, sagst dazu dass du BugFix UDF verwendest (mit link) dann hast du innerhalb von paar Stunden wahrscheinlich ne Antwort.
    Anders hast du jetzt nen Thread auf, in dem du nichts von deinem Script preisgibst, das interessant ist, und wartest auf die PN von BugFix

  • Hi,
    sorry da war ich etwas zu schnell mit meiner Mailschreiberei...
    Ich habe aber mittlerweile meinen Fehler gefunden.

    Also mit der UDF von Bugfix funktioniert's problemlos !

    Gruß

    Markus