Sign in to follow this  
Followers 0
MrPinkComputerShrink

__GUICtrlListView_AddItem - Coloring independent row text in the listview

12 posts in this topic

Trying to use LV_Format_include1.3.au3  

    Format Listview Item
        _GUICtrlListView_FormattingCell($hWnd, $iItem, $iSubItem, $iBkCol=-1, $iCol=-1, $iSize=-1, $iWeight=-1, $sFont=-1)
            $hWnd        Listview handle
            $iItem        Item index
            $iSubItem    SubItem index
            $iBkCol        back color (-1 = default BkCol)
            $iCol        text color (-1 = default txtCol)
            $iSize        height of font (-1 = 14)
            $iWeight    font weight    (-1 = 400)
            $sFont        typefont name  (-1 = Arial)

 

I need to be able to make variuos rows in the listview differnet colors.

i.e.  Channel 1 = BLACK   Channel 6 = BLUE  Channel 11 = NAVE   Other = RED

Problem Starts at 272

 

Any help would be great1

#include <Array.au3>
#include <AVIConstants.au3>
#include <Constants.au3>
#include <Date.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <IE.au3>
#include <Process.au3>
#include <StaticConstants.au3>
#include <String.au3>
#include <TreeViewConstants.au3>
#include <ListViewConstants.au3>
#include <ColorConstants.au3>
#include <WinAPI.au3>
#include <Inet.au3>
#include <LV_Format_include1.3.au3>
;~ #include <Services.au3>
;~ #include <NetInfo.au3>
#include <WindowsConstants.au3>
#include <GuiImageList.au3>



Global $g_idListView = 99999
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1) ; This disables 32bit applications from being redirected to syswow64 instead of system32 by default ;


ConsoleWrite("Loaded #include Files" & @CRLF)


Global $SSID, $BSSID, $Signal, $Authentication, $Encryption

GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
ConsoleWrite("Created Variables" & @CRLF)


DirCreate(@TempDir & "\WifiExample")
$WifiTempDir = (@TempDir & "\WifiExample")
ConsoleWrite("Created $WifiTempDir directory at " & $WifiTempDir & @CRLF)

Call("_WifiNetsPrep")
Call("_WifiNets")


$Gooey = GUICreate("Sortable Wifi Tab", 770, 540)
_GUICtrlListView_Formatting_Startup($Gooey, $g_idListView)
$Tab = GUICtrlCreateTab(10, 0, 755, 530) ; -15 x -10



$Tab5 = GUICtrlCreateTabItem("Wifi") ;- ==========================================================================  Wifi Networks


GUICtrlCreateTabItem("")
_BuildLV()

GUISetState()
While 1


    Switch GUIGetMsg()
        Case $Tab
            Switch GUICtrlRead($Tab)
                Case $Tab
                Case 0
                    ;ConsoleWrite ("1st Tab  " & @CRLF  )  ; Status
                Case 1
                    ;ConsoleWrite ("2nd Tab  " & @CRLF  )  ; ARP/UPnP
                Case 2
                    ;ConsoleWrite ("3rd Tab  "& @CRLF  )    ; Pings
                Case 3
                    ;ConsoleWrite ("4th Tab  " & @CRLF  )   ; 1400s
                Case 4
;~                  GUISwitch($Gooey, $Tab5)


            EndSwitch

        Case $GUI_EVENT_CLOSE
            ConsoleWrite("Case $GUI_EVENT_CLOSE in main loop" & @CRLF)
            DirRemove($WifiTempDir)
            Exit
        Case $g_idListView
            _SortBy()
    EndSwitch



WEnd

Func _WifiNetsPrep()
    Local $rc = _RunDos("netsh wlan show all > " & $WifiTempDir & "WifiData.txt")
    Global $WifiData2 = $WifiTempDir & "WifiData.txt"
    ConsoleWrite("WIfiTab $$WifiData2  " & $WifiData2)
    Local $WifiNets = FileRead($WifiData2)
    FileOpen($WifiData2, 2)
    Local $Trim1 = StringInStr($WifiNets, "SSID 1")
    $WifiNets = StringTrimLeft($WifiNets, $Trim1 - 6)
    FileWrite($WifiData2, $WifiNets)
    FileClose($WifiData2)
    $WifiNets = FileOpen($WifiData2, 1)
    FileWriteLine($WifiNets, "END")
    FileClose($WifiNets)
EndFunc   ;==>_WifiNetsPrep

Func _WifiNets()
    ConsoleWrite("Called _WifiNets()" & @CRLF)
    $WifiNets = FileOpen($WifiData2, 0)
    Local $WifiNetsParsed = FileOpen($WifiTempDir & "WifiNetsParsed.txt", 2)

    Do
        Local $WifiNetLine = FileReadLine($WifiNets)

        Local $SSIDCheck = StringInStr($WifiNetLine, "SSID")
        If $SSIDCheck <> 0 Then FileWriteLine($WifiNetsParsed, $WifiNetLine)


        Local $AuthenticationCheck = StringInStr($WifiNetLine, "Authentication")
        If $AuthenticationCheck <> 0 Then FileWriteLine($WifiNetsParsed, $WifiNetLine)


        Local $EncryptionCheck = StringInStr($WifiNetLine, "Encryption")
        If $EncryptionCheck <> 0 Then FileWriteLine($WifiNetsParsed, $WifiNetLine)


        Local $SignalCheck = StringInStr($WifiNetLine, "Signal")
        If $SignalCheck <> 0 Then FileWriteLine($WifiNetsParsed, $WifiNetLine)

        Local $ChannelCheck = StringInStr($WifiNetLine, "Channel")
        If $ChannelCheck <> 0 Then FileWriteLine($WifiNetsParsed, $WifiNetLine)
        If $ChannelCheck <> 0 Then FileWriteLine($WifiNetsParsed, " ")

    Until $WifiNetLine = "END"

    FileClose("$WifiData2")
    FileWriteLine($WifiNetsParsed, "END")
    FileClose($WifiNetsParsed)
    $font = ("MS Sans Serif")
    GUISetFont(9, 400, 1, $font)
    Local $iListView = GUICtrlCreateListView("Detected Wifi Networks                                            ", 30, 90, 725, 430)
    _GUICtrlListView_SetColumnWidth($iListView, 0, $LVSCW_AUTOSIZE_USEHEADER)
    $WifiNetsParsed = FileOpen($WifiTempDir & "WifiNetsParsed.txt", 0)

    Do
        $WifiNets = FileReadLine($WifiNetsParsed)

        GUICtrlCreateListViewItem($WifiNets, $iListView)
    Until $WifiNets = "END"

EndFunc   ;==>_WifiNets

Func _BuildLV() ;  Wifi data sort

    ConsoleWrite("Called SortBy" & @CRLF)
;~  Global $g_idListView
    Local $hImage, $aIcons[3] = [0, 3, 6]
    Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
    Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)

    GUISwitch($Gooey, $Tab5)

    $g_idListView = GUICtrlCreateListView("SSID|BSSID|Channel|Signal|Authentication|Encryption", 20, 25, 730, 500, -1, $iExWindowStyle) ;28, 25, 725, 500

    _GUICtrlListView_SetExtendedListViewStyle($g_idListView, $iExListViewStyle)

    $WifiNets = FileOpen($WifiData2, 0)

    Do
        Global $WifiNetLine = FileReadLine($WifiNets)
        Global $SSIDCheck = StringInStr($WifiNetLine, "SSID")
        Global $AuthenticationCheck = StringInStr($WifiNetLine, "Authentication")
        Global $EncryptionCheck = StringInStr($WifiNetLine, "Encryption")
        Global $BSSIDCheck = StringInStr($WifiNetLine, "BSSID")
        Global $SignalCheck = StringInStr($WifiNetLine, "Signal")
        Global $ChannelCheck = StringInStr($WifiNetLine, "Channel")
        If $SSIDCheck <> 0 And $BSSIDCheck = 0 Then Call("_SSIDTrimmer")
        If $SSIDCheck <> 0 And $BSSIDCheck <> 0 Then Call("_BSSIDTrimmer")
        If $AuthenticationCheck <> 0 Then Call("_AuthenticationTrimmer")
        If $EncryptionCheck <> 0 Then Call("_EncryptionTrimmer")
        If $SignalCheck <> 0 Then Call("_SignalTrimmer")
        If $ChannelCheck <> 0 Then Call("_ChannelTrimmer")

    Until $WifiNetLine = "END"

    GUISetState(@SW_SHOW)

    _GUICtrlListView_RegisterSortCallBack($g_idListView)
    Local $count = 0

EndFunc   ;==>_BuildLV
Func _SortBy()
    $Column = GUICtrlGetState($g_idListView)
    _GUICtrlListView_SortItems($g_idListView, $Column)
EndFunc   ;==>_SortBy

Func _SSIDTrimmer()
    ;ConsoleWrite( @ScriptLineNumber & " Called _SSIDTrimmer()" & @CRLF)
    ;msgbox (0, "Func _SSIDTrimmer()", "We're Here Now")
    Local $Colon = StringInStr($WifiNetLine, ":")
    $SSID = StringTrimLeft($WifiNetLine, $Colon)
    ;Local $BSSID_WAP = 0
    ;msgbox (0, "$SSID ", $SSID)
EndFunc   ;==>_SSIDTrimmer

Func _BSSIDTrimmer()
    ;ConsoleWrite( @ScriptLineNumber & " Called _BSSIDTrimmer()" & @CRLF)
    ;msgbox (0, "Func _BSSIDTrimmer()", "We're Here Now")
    Local $Colon = StringInStr($WifiNetLine, ":")
    $BSSID = StringTrimLeft($WifiNetLine, $Colon)
    ;Local $BSSID_WAP = 1
    ;msgbox (0, "$BSSID ", $BSSID)
EndFunc   ;==>_BSSIDTrimmer

Func _AuthenticationTrimmer()
    ;msgbox (0, "_SignalTrimmer()", "We're Here Now")
    Local $Colon = StringInStr($WifiNetLine, ":")
    $Authentication = StringTrimLeft($WifiNetLine, $Colon)
    ;msgbox (0, "$Authentication ", $Authentication)
EndFunc   ;==>_AuthenticationTrimmer

Func _EncryptionTrimmer()
    ;msgbox (0, "_SignalTrimmer()", "We're Here Now")
    Local $Colon = StringInStr($WifiNetLine, ":")
    $Encryption = StringTrimLeft($WifiNetLine, $Colon)
    ;msgbox (0, "$Encryption ", $Encryption)
EndFunc   ;==>_EncryptionTrimmer

Func _SignalTrimmer()
    ;msgbox (0, "_SignalTrimmer()", "We're Here Now")
    Local $Colon = StringInStr($WifiNetLine, ":")
    $Signal = StringTrimLeft($WifiNetLine, $Colon)
    ;msgbox (0, "$Signal ", $Signal)
EndFunc   ;==>_SignalTrimmer

Func _ChannelTrimmer()
    ConsoleWrite(@ScriptLineNumber & " Called _ChannelTrimmer" & @CRLF)
    Local $Colon = StringInStr($WifiNetLine, ":")
    $Channel = StringTrimLeft($WifiNetLine, $Colon)
    GLobal $bChannel = Number($Channel)
    ;msgbox (0, "$bChannel ", $bChannel)

    _AddRow($g_idListView, $SSID & "|" & $BSSID & "|" & $bChannel & "|" & $Signal & "|" & $Authentication & "|" & $Encryption) ; Passing Data to AddRow
    ;$SSID = ""
    $BSSID = ""
    $Authentication = ""
    $Encryption = ""
    $Channel = ""
    $Signal = ""
EndFunc   ;==>_ChannelTrimmer

Func _AddRow($hWnd, $sItem, $iPlus = 0)
    ConsoleWrite(@ScriptLineNumber & " Called _AddRow" & @CRLF)
    Local $aItem = StringSplit($sItem, "|")
    Local $iIndex = _GUICtrlListView_AddItem($hWnd, $aItem[1], +$iPlus, _GUICtrlListView_GetItemCount($hWnd) + 9999)
    _GUICtrlListView_SetColumnWidth($hWnd, 0, $LVSCW_AUTOSIZE_USEHEADER)

;~ Format Listview Item
;~      _GUICtrlListView_FormattingCell($hWnd, $iItem, $iSubItem, $iBkCol=-1, $iCol=-1, $iSize=-1, $iWeight=-1, $sFont=-1)
;~          $hWnd       Listview handle
;~          $iItem      Item index
;~          $iSubItem   SubItem index
;~          $iBkCol     back color (-1 = default BkCol)
;~          $iCol       text color (-1 = default txtCol)
;~          $iSize      height of font (-1 = 14)
;~          $iWeight    font weight    (-1 = 400)
;~          $sFont      typefont name  (-1 = Arial)

    For $x = 2 To $aItem[0]
        _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aItem[$x], $x - 1, $iPlus)
        Local $aItemx = $aItem[$x]
;~      msgbox(0, "$bChannel", $bChannel)
;~          If $bChannel = 1 Then
;~          _GUICtrlListView_FormattingCell($hWnd, $iIndex, $x - 1,-1, $COLOR_RED,-1,-1,-1)

;~      ElseIf $bChannel = 6 Then
;~          _GUICtrlListView_FormattingCell($hWnd, $iIndex, $x - 1,-1, $COLOR_BLUE,-1,-1,-1)
;~      ElseIf $bChannel = 11 Then
;~          _GUICtrlListView_FormattingCell($hWnd, $iIndex, $x - 1,-1, $COLOR_NAVY,-1,-1,-1)
;~      ElseIf $bChannel = 3 Then
;~          _GUICtrlListView_FormattingCell($hWnd, $iIndex, $x - 1,-1, $COLOR_BLACK,-1,-1,-1)
;~      ElseIf $bChannel = 9 Then
;~          _GUICtrlListView_FormattingCell($hWnd, $iIndex, $x - 1,-1, $COLOR_RED,-1,-1,-1)
;~  EndIf




        _GUICtrlListView_SetColumnWidth($hWnd, $x - 1, $LVSCW_AUTOSIZE)
    Next
    ConsoleWrite(@ScriptLineNumber & " Return from _AddRow" & @CRLF)
EndFunc   ;==>_AddRow



Func _CleanUp()

    FileClose($WifiTempDir & "WifiNetsParsed.txt")
    FileClose($WifiTempDir & "WifiChannel.txt")

    Sleep(500)

    FileDelete($WifiTempDir & "WifiNetsParsed.txt")
    FileDelete($WifiTempDir & "WifiChannel.txt")

EndFunc   ;==>_CleanUp

LV_Format_include1.3.au3

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Either you all think I'm an idiot or this is a tough one. Or both.

If you were going to do it without LV_Format_include1.3.au3, how could it be done?

Edited by MrPinkComputerShrink

Share this post


Link to post
Share on other sites

MrPinkComputerShrink ,

Colouring ListView lines is easy - >this post shows how to do it. All you need to do is change the colour depending on the "Channel" value. :)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______My UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites

Thank M23,

GUICtrlSetColor does not work with _GUICtrlListView_AddItem or _GUICtrlListView_AddSubItem...

:-(

Share this post


Link to post
Share on other sites

Still have not found an answer.  I can go with colored text where colored rows follow the sort or I can go with colored background on rows.

Key thing is I have seperate colored rows the follow the sort.

Help!   Please.

Share this post


Link to post
Share on other sites

Take a look at this example.

Just add a new post to your thread, if you need more help about the details.

A main issue in custom draw is, that the code for $NM_CUSTOMDRAW events must be short and fast. The code in LV_Format.au3 in this thread is too long and slow.

Share this post


Link to post
Share on other sites

Thank you  LarsJ for the Examples.

I see that is can be done, unfortunately this is way over my head and I just don't know where to start in implementing it in my code. Automation is my specialty, not GUI.

I am presenting this tool on Friday and as usual have a lot of other things on my plate. I think the color rows may have to be in ver. 2 .

I do see that the colors are being assigned to rows and I am concerned that it may or may not follow the row when sorting by column is clicked.  

Scott

Share this post


Link to post
Share on other sites

Here is a small example:

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>

$Gooey = GUICreate("Sortable Wifi Tab", 770, 540)
$Tab = GUICtrlCreateTab(10, 0, 755, 530)
$Tab5 = GUICtrlCreateTabItem("Wifi")

$iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
$iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_DOUBLEBUFFER)
$g_idListView = GUICtrlCreateListView("SSID|BSSID|Channel|Signal|Authentication|Encryption", 20, 25, 730, 500, -1, $iExWindowStyle)
$hListView = GUICtrlGetHandle( $g_idListView )
_GUICtrlListView_SetExtendedListViewStyle($hListView, $iExListViewStyle)

_GUICtrlListView_BeginUpdate( $hListView )
For $i = 0 To 30
  $iIndex = _GUICtrlListView_AddItem( $hListView, Random( 0, 1000, 1 ) )
  _GUICtrlListView_SetItemParam( $hListView, $iIndex, 0x0000FF + 1000 ) ; Red, BGR
  For $j = 1 To 5
    _GUICtrlListView_AddSubItem( $hListView, $iIndex, Random( 0, 1000, 1 ), $j )
  Next
Next
_GUICtrlListView_SetItemParam( $hListView,  1, 0x000000 + 1000 ) ; Black, BGR
_GUICtrlListView_SetItemParam( $hListView,  6, 0xFF0000 + 1000 ) ; Blue,  BGR
_GUICtrlListView_SetItemParam( $hListView, 11, 0x800000 + 1000 ) ; Navy,  BGR
_GUICtrlListView_EndUpdate( $hListView )

GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )

GUISetState()
While 1
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  Local $tNMHDR, $hWndFrom, $iCode
  $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
  $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  $iCode = DllStructGetData($tNMHDR, "Code")

  Switch $hWndFrom

    Case $hListView

      Switch $iCode

        Case $NM_CUSTOMDRAW
          Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
          Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")

          Switch $dwDrawStage             ; Holds a value that specifies the drawing stage

            Case $CDDS_PREPAINT
              ; Before the paint cycle begins
              Return $CDRF_NOTIFYITEMDRAW ; Notify the parent window of any item-related drawing operations

            Case $CDDS_ITEMPREPAINT
              ; Before painting an item
              Local $iItemlParam = DllStructGetData($tNMLVCUSTOMDRAW, "lItemlParam") - 1000 ; Item param = color + 1000
              DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF)                       ; Forcolor of item text
              DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", $iItemlParam)                 ; Backcolor of item text
              Return $CDRF_NEWFONT        ; $CDRF_NEWFONT must be returned after changing font or colors

          EndSwitch

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc

Since color + 1000 is stored in ItemParam, the row will get the proper color even if it's sorted in another order.

1 person likes this

Share this post


Link to post
Share on other sites

@LarsJ,

Thank you for this code.  Unfortunately is does not sort on my system.  

GUI problems have taken 3 times longer than planned. Due to time constraints; sortable,colored listview items have been replaced with colored square icons for this iteration.   Ver. 2 I hope.

Thank you again.  This Forum, AutoIt and You Rock!

Scott

Share this post


Link to post
Share on other sites

At least you've got several ideas in this thread. You may find it useful when have more time for your project.

Regards Lars.

Share this post


Link to post
Share on other sites

That's the plan.  Was going with colored 16 x 16 boxes today and that did not work out either. I am not a GUI expert, but I will be by Ver 3 of this thing.

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
Sign in to follow this  
Followers 0