Jump to content

set Listview item color and attribute

Recommended Posts


I want to set an item's color and attribute (bold, italics, etc.) in a listview. (I am forced to create the listview and it's individual items using _GUICtrlListView_... functions due to a sort issue.)

My test code looks like this:

#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ColorConstants.au3>
#include <FontConstants.au3>

Opt("GUICloseOnESC", 1) ; ESC closes GUI
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
Opt('MustDeclareVars', 1)

exit (1)

Func _Main()
    Local $hMainWin, $hListview, $IDListview, $aList[10]

    For $x = 0 To UBound($aList) - 1
        For $y = 0 To 3
            $aList[$x] &= Chr(0x41 + $x) & $y & "|" ; Load the list with values

    $hMainWin = GUICreate("Test2", 320, 220)
    $hListview = createListView($hMainWin)
    loadItemsListView($hListview, $aList)

    GUISetOnEvent($GUI_EVENT_CLOSE, 'Event_GUIClose') ; CLOSE events

    setListViewRowColor($hListview, 1, $COLOR_RED, $aList)
    setListViewRowAttr($hListview, 3, $FW_BOLD, $aList)


    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Main

Func createListView($hWndMain)
    Local $flags, $xflags, $hWnd
    $flags = BitOR($LVS_REPORT, $flags, $LVS_SHOWSELALWAYS)
    $hWnd = _GUICtrlListView_Create($hWndMain, "Col1|col2|col3|col4", 10, 10, 300, 200, $flags)
    _GUICtrlListView_SetExtendedListViewStyle($hWnd, $xflags)
    return ($hWnd)
EndFunc   ;==>createListView

Func loadItemsListView($hWnd, ByRef $ar)
    Local $row, $item, $aItem, $iIndex


    For $row = 0 To UBound($ar) - 1
        $item = $ar[$row]
        $aItem = StringSplit($item, "|") ; Break the item into parts
        $iIndex = _GUICtrlListView_AddItem($hWnd, $aItem[1], -1, $row)
        For $ndx = 2 To UBound($aItem) - 1
            _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aItem[$ndx], $ndx - 1)
EndFunc   ;==>loadItemsListView

Func Event_GUIClose()
    exit (0)
EndFunc   ;==>Event_GUIClose

Func setListViewRowColor($hWnd, $iItemNum, $iColor, ByRef $ar)
EndFunc   ;==>setListViewRowColor

Func setListViewRowAttr($hWnd, $iItemNum, $iAttr, ByRef $ar)
EndFunc   ;==>setListViewRowAttr

I need to fill in code in the setListViewRowColor() and setListViewRowAttr() functions.

Share this post

Link to post
Share on other sites

Have you tried to search "Example Scripts" section? I remember that long ago I've seen someting similar made by Yashied or Rasim ...

Have a look, I'm pretty sure you'll find something you can use.

SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script

wannabe "Unbeatable" Tic-Tac-Toe

Paper-Scissor-Rock ... try to beat it anyway :)

Share this post

Link to post
Share on other sites

Or why not use small icons/bitmaps, search _GUICtrlListView_CreateSolidBitMap() in the Help File. This is what I have done in the past to show if (for example) a file has copied or not (green/red)

UDF List:

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Share this post

Link to post
Share on other sites

OK, I solved it using code I found by Googling the problem. What I had to do was hook into the $NM_CUSTOMDRAW event for the listbox. Actually, it's pretty slick. All I had to do was to set each item's param with a color number when I added them to the listview, and in the hook code, read the color number and convert it to a RGB color, then set the clrText element to that value. It was important that I surround the listbox item creation with a _GUICtrlListView_BeginUpdate() and _GUICtrlListView_EndUpdate() to keep from firing off $NM_CUSTOMDRAW events. When the _GUICtrlListView_EndUpdate() is called, there will be an $NM_CUSTOMDRAW event fired off for each item. That's where I added the color.

This technique could be used to set text to bold, italics, etc. as well.

Here is a test script that demonstrates what I'm talking about:

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

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

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


; _Main() - Main function
Func _Main()


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


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

    While 1

EndFunc   ;==>_Main

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

Func Event_GUIClose()
EndFunc   ;==>Event_GUIClose

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

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

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

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

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

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



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

        $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)

EndFunc   ;==>loadListView

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

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

; 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

EndFunc   ;==>WM_NOTIFY

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

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

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

Func handle_Color_btn()
    Local $item, $parts

    $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
EndFunc   ;==>handle_Color_btn

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.