Neue Funktionen zu ListView - seit 3.2.10.0

  • Hi,

    ich habe eine Listview in dem ich den Text von bestimmten Zeilen färben will.

    Mit der letzten AutoIt Version hat dies auch noch wunderbar geklappt.

    Da sich nun mit der neuen Version die ListView-Befehle komplett geändert haben, mußte ich mein Script umschreiben

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    Opt('MustDeclareVars', 1)
    $Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work
    Global $hListView, $test, $farbe
    Local $GUI, $hImage
    $GUI = GUICreate("(External) ListView Create", 400, 300)
    $hListView = _GUICtrlListView_Create ($GUI, "", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle ($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    GUISetState()
    ; Add columns
    _GUICtrlListView_InsertColumn ($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn ($hListView, 1, "Column 2", 100)
    ; Add items
    _GUICtrlListView_AddItem ($hListView, "1", 0)
    _GUICtrlListView_AddItem ($hListView, "2", 1)
    _GUICtrlListView_AddItem ($hListView, "3", 1)
    For $i = 0 to 2
    $test = _GUICtrlListView_GetItemText($hListView, $i, 0)
    ;~ MsgBox(0,"", $test)
    If $test = 2 Then
    MsgBox(0,$i, "färben")
    $farbe = _GUICtrlListView_SetTextColor($hListView, 0xFFA500)
    MsgBox(0,$i, $farbe)
    EndIf
    Next
    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit]

    Leider habe ich keine passende Funktion gefunden. Es wird nur alle Zeilen gefärbt :thumbdown:

    bernd670: AutoIt-Tag korrigiert!


    Es soll nur die Zeile gefärbt werden, in der der Wert "2" steht.

    • Offizieller Beitrag

    Hi Tweaky,

    ich hab nochmal etwas getestet.
    Also wenn du einzelne Items andersfarbig darstellen möchtest, darfst du viele der neuen ListView-Funktionen nicht in deinem Skript haben.
    - um den Text eines Items zu färben brauchst du ein Handle dafür
    - _GUICtrlListView_AddItem() gibt kein Handle, sondern den Index zurück ==> fällt somit raus
    - um ein Handle zu erhalten mußt du das Item mit GUICtrlCreateListViewItem() erstellen, dann kannst du es normal mit GUICtrlSetColor() färben
    - um aber Items mit GUICtrlCreateListViewItem() zu erzeugen, darf das ListView NICHT mit _GUICtrlListView_Create() erstellt werden

    Ergo: Die neue Funktionalität (Icons, Checkboxes etc.) kann unter diesen Umständen nicht genutzt werden. Ich weiß nicht ob man sich hier über die neuen Funktionen freuen oder den Verlust der alten bedauern soll. 8|
    Bei mir überwiegt derzeit das Bedauern.

    Hier dein Bsp. so angepaßt, dass es wieder funzt:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    Opt('MustDeclareVars', 1)
    $Debug_LV = False ; Check ClassName being passed to ListView functions, set to True and use a handle to another control to see it work
    Global $hListView, $test, $farbe
    Local $GUI, $hImage , $arItems[3]
    $GUI = GUICreate("(External) ListView Create", 400, 300)
    ;~ $hListView = _GUICtrlListView_Create ($GUI, "", 2, 2, 394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    $hListView = GUICtrlCreateListView('', 2, 2,394, 268, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle ($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
    GUISetState()
    ; Add columns
    _GUICtrlListView_InsertColumn ($hListView, 0, "Column 1", 100)
    _GUICtrlListView_InsertColumn ($hListView, 1, "Column 2", 100)
    ; Add items
    ;###### NICHT "_GUICtrlListView_AddItem" verwenden, dann hast du kein Handle für die Items !! ########
    $arItems[0] = GUICtrlCreateListViewItem ("1", $hListView)
    $arItems[1] = GUICtrlCreateListViewItem ("2", $hListView)
    $arItems[2] = GUICtrlCreateListViewItem ("3", $hListView)
    For $i = 0 to 2
    $test = _GUICtrlListView_GetItemText($hListView, $i, 0)
    If $test = 2 Then
    MsgBox(0,$i, "färben")
    ;~ $farbe = _GUICtrlListView_SetTextColor($arItems[$i], 0xFFA500)
    GUICtrlSetColor($arItems[$i], 0xFFA500)
    ;~ MsgBox(0,$i, $farbe)
    EndIf
    Next
    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUIDelete()

    [/autoit]
  • Danke BugFix,

    nun funktioniert mein Script wieder.

    Zum Glück brauche ich (noch) nicht das neue ListView :rofl:


    EDIT:

    Hab was im englischen Forum gefunden.

    http://www.autoitscript.com/forum/index.php?showtopic=58714&st=0&p=443841&#entry443841

    Es können einzelne Zeilen gefärbt werden.

    Allerdings weiss ich nicht, ob dies auch je nach Zellinhalt erfolgen kann.

    Hab das englische script mal auf das wesentliche gekürzt. Vielleicht kann jemand (BugFix :P ) was damit anfangen

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w 7
    Opt("MustDeclareVars", 1)
    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <GuiStatusbar.au3>
    #include <Constants.au3>
    Global Const $tagNMLVCUSTOMDRAW = "hwnd hWndFrom;int IDFrom;int Code;dword dwDrawStage;hwnd hdc;int Left;int Top;int Right;int Bottom;" & _
    "dword dwItemSpec;uint uItemState;long lItemlParam;int clrText;int clrTextBk;int iSubItem;dword dwItemType;int clrFace;int iIconEffect;" & _
    "int iIconPhase;int iPartId;int iStateId;int TextLeft;int TextTop;int TextRight;int TextBottom;uint uAlign"
    Global Const $CDDS_PREPAINT = 0x00000001
    Global Const $CDDS_ITEMPREPAINT = 0x00010001
    Global Const $CDRF_NEWFONT = 0x00000002
    Global Const $CDRF_NOTIFYITEMDRAW = 0x00000020
    #region Globals *************************************************************************
    Global $hDragImageList, $h_ListView, $bDragging = False, $LV_Height, $StatusBar1
    Global $a_index[2] ; from and to
    Global Const $DebugIt = 1
    #endregion End Global variables
    Opt("WinTitleMatchMode", 2)
    _TestDragItemWithImages()
    Func _TestDragItemWithImages()
    Local Const $image_width = 20
    Local Const $image_height = 20
    Local $h_images, $main_GUI, $iIndex

    $main_GUI = GUICreate("GuiRegisterMsg Test", 225, 400)

    $h_ListView = _GUICtrlListView_Create($main_GUI, "Entry Name|Category", 5, 75, 220, 280, -1, BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
    $LV_Height = 280 - 75
    _GUICtrlListView_SetColumnWidth($h_ListView, 0, 100)
    _GUICtrlListView_SetColumnWidth($h_ListView, 1, 100)
    _GUICtrlListView_SetExtendedListViewStyle($h_ListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
    ;Register WM_NOTIFY events
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    ;------------------------------------------------------
    Local $y = 1
    For $x = 0 To 9
    $iIndex = _GUICtrlListView_AddItem($h_ListView, "Name " & $x + 1, $y) ; handle, string, image index
    _GUICtrlListView_AddSubItem($h_ListView, $iIndex, "Category " & $x + 1, 1, $y + 1) ; handle, index, string, subitem, image index
    $y += 2
    Next
    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd
    EndFunc ;==>_TestDragItemWithImages

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

    ;
    ; WM_NOTIFY event handler
    Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tNMHDR, $code, $x, $y, $tNMLISTVIEW, $hwndFrom, $tDraw, $dwDrawStage, $dwItemSpec
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam) ;NMHDR (hwndFrom, idFrom, code)
    If @error Then Return
    $code = DllStructGetData($tNMHDR, "Code")
    $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    Switch $hwndFrom
    Case $h_ListView
    Switch $code
    Case $NM_CUSTOMDRAW
    ;~ If $DebugIt Then _DebugPrint("$NM_CUSTOMDRAW")
    $tDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
    $dwDrawStage = DllStructGetData($tDraw, "dwDrawStage")
    $dwItemSpec = DllStructGetData($tDraw, "dwItemSpec")
    Switch $dwDrawStage
    Case $CDDS_PREPAINT
    Return $CDRF_NOTIFYITEMDRAW
    Case $CDDS_ITEMPREPAINT
    If BitAND($dwItemSpec, 1) = 1 Then
    DllStructSetData($tDraw, "clrTextBk", $CLR_AQUA)
    Else
    DllStructSetData($tDraw, "clrTextBk", $CLR_WHITE)
    EndIf
    Return $CDRF_NEWFONT
    EndSwitch
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    #endregion Event Function(s) ***********************************************************************************************

    [/autoit]