Sign in to follow this  
Followers 0
dickep

Color only parts of row

9 posts in this topic

#1 ·  Posted (edited)

OK, I have my app below. It does what I want but I need to have only conlumns 1 and 2 colored light green BUT ONLY if it is YES. I can't find out how to do that.

Cut and paste the following HEX string into the input box for testing if necessary:

0xE001FFFD7D5F0400007000140000435FFF32

P.S. This is a cluge of many others works. I don't remember where they all came from but am sure glad this forum and the folks willing to help is here!!

Thanks

E

#include <Color.au3>
#include <GUIConstantsEX.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <String.au3>
#include <WindowsConstants.au3>
Global Const $HX_REF="0123456789ABCDEF"
Global Const $color1 = 0x99A8AC
Global Const $color2 = 0xFFFFFF

;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", "")
$Gui = GUICreate("Plan Decoder", 400, 350, 161, 166)
GUISetIcon (@windowsdir & "system32Calc.exe",-1,$Gui)
$Size = WinGetClientSize($Gui)
$GoButton = GUICtrlCreateButton ("Go", 300, 100, 60, 20)
GUICtrlSetBkColor(-1,0xA1AFB2)
$label = GUICtrlCreateLabel("", 10, 15, 50, 15)
GUICtrlSetBkColor(-1,0xA1AFB2)
$labelout2 = GUICtrlCreateLabel("Cut and paste the HEX information below", 10, 5, 300, 15)
GUICtrlSetBkColor(-1,0xAEBABD)
$labelout = GUICtrlCreateLabel("Plan", 10, 45, 70, 15)
GUICtrlSetBkColor(-1,0xAEBABD)
$Input1 = GUICtrlCreateInput("", 100, 40, 250, 21)
;~ $list1 = GUICtrlCreateList("Ch # Selected",50, 75, 250, 250, BitOr($WS_BORDER, $WS_VSCROLL))
    Local $list1 = GUICtrlCreateListView("", 10, 75, 300 - 20, 250, BitOR($LVS_REPORT, $LVS_SINGLESEL, $WS_BORDER), $LVS_EX_FULLROWSELECT)
$hListView = ControlGetHandle($gui, '', $list1)
_GUICtrlListView_InsertColumn($hListView, 0, "Ch #", 40,2)
_GUICtrlListView_InsertColumn($hListView, 1, "Selected", 60, 2)
_GUICtrlListView_InsertColumn($hListView, 2, "Test info", 140, 2)
_GUICtrlCreateGradient($color1, $color2, 0, 0, $size[0]*1.5, $size[1])
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $GoButton
   ; delete anything in the listview first
    _GUICtrlListView_DeleteAllItems($list1)
   $input2process = GUICtrlRead($Input1)
   $inputNew = stringmid($input2process, 7, stringlen($input2process) - 8)
   $BinaryString = StringMid(_HexToBinaryString(StringStripWS($inputNew,8)), 1, 124)
   ConsoleWrite('Binary String returned: ' & $BinaryString & @CRLF & 'Binary len: ' & StringLen($BinaryString) & @CRLF)
   if $BinaryString = 0 Then
    MsgBox(0,"Error","Wrong input, try again ...")
    ContinueLoop
   EndIf
   $y = 1
   for $i = 1 to StringLen($BinaryString)
    ConsoleWrite($i + 4 & " - " & StringMid($BinaryString, $i, 1) & @CRLF)
    Switch $i + 4
     Case 5 To 9
      $channelNum = '   ' & $i + 4
     Case 10 To 99
      $channelNum = '  ' & $i + 4
     Case 100 To 999
      $channelNum = ' ' & $i + 4
     Case Else
      $channelNum = $i + 4
    EndSwitch
    if StringMid($BinaryString, $i, 1) = 1 Then
     $chanSelected = "  Yes"
    Else
     $chanSelected = ""
    EndIf
    $ch = ""
    ; check the len of the input line anfor output to the screen for the channel hex information
    if $y <= StringLen($inputNew) Then
     switch $i
      case 1
       $ch = 'Channels 005-012: 0x' & StringLower(StringMid($inputNew, $y, 2))
      case 2
       $ch = 'Channels 013-020: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 3
       $ch = 'Channels 021-028: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 4
       $ch = 'Channels 029-036: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 5
       $ch = 'Channels 037-044: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 6
       $ch = 'Channels 045-052: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 7
       $ch = 'Channels 053-060: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 8
       $ch = 'Channels 061-068: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 9
       $ch = 'Channels 069-076: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 10
       $ch = 'Channels 077-084: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 11
       $ch = 'Channels 085-092: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 12
       $ch = 'Channels 093-100: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 13
       $ch = 'Channels 101-108: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 14
       $ch = 'Channels 109-116: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 15
       $ch = 'Channels 117-124: 0x' & StringLower(StringMid($inputNew, $y, 2))
      Case 16 to 1000
       $ch = ''
        EndSwitch
        $y += 2
    EndIf
    ConsoleWrite("I = " & $i & '   Channels variable: ' & $ch & @CRLF)
    _GUICtrlListView_AddItem($hListView, $i+4, $channelNum, $i-1)
    _GUICtrlListView_AddSubItem ($hListView, $i-1,  $chanSelected, 1)
    _GUICtrlListView_AddSubItem ($hListView, $i-1,  $ch, 2)
   Next
    EndSelect
WEnd
; Conversion Code - Chart
; DECIMAL  0    1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16
; HEX     0 1   2   3   4   5   6   7   8   9   A   B   C   D   E   F   10
; BINARY 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111  10000

; --------------------- Functions -----------------------------
; Hex To Binary
Func _HexToBinaryString($hexvalue)
    Local $Allowed = '0123456789ABCDEF'
    Local $Test,$n
    Local $Result = ''
    if $hexvalue = '' then
        SetError(-2)
        Return
    EndIf
    $hexvalue = StringSplit($hexvalue,'')
    for $n = 1 to $hexValue[0]
        if not StringInStr($Allowed,$hexvalue[$n]) Then
            SetError(-1)
            return 0
        EndIf
    Next
    Local $bits = "0000|0001|0010|0011|0100|0101|0110|0111|1000|1001|1010|1011|1100|1101|1110|1111"
    $bits = stringsplit($bits,'|')
    for $n = 1 to $hexvalue[0]
        $Result &=  $bits[Dec($hexvalue[$n])+1]
    Next
    Return $Result
EndFunc
Func _GUICtrlCreateGradient($nStartColor, $nEndColor, $nX, $nY, $nWidth, $nHeight)
    Local $color1R = _ColorGetRed($nStartColor)
    Local $color1G = _ColorGetGreen($nStartColor)
    Local $color1B = _ColorGetBlue($nStartColor)
    Local $nStepR = (_ColorGetRed($nEndColor) - $color1R) / $nHeight
    Local $nStepG = (_ColorGetGreen($nEndColor) - $color1G) / $nHeight
    Local $nStepB = (_ColorGetBlue($nEndColor) - $color1B) / $nHeight
    GuiCtrlCreateGraphic($nX, $nY, $nWidth, $nHeight)
    For $i = 0 To $nHeight - $nY
        $sColor = "0x" & StringFormat("%02X%02X%02X", $color1R+$nStepR*$i, $color1G+$nStepG*$i, $color1B+$nStepB*$i)
        GUICtrlSetGraphic(-1, $GUI_GR_COLOR, $sColor, 0xffffff)
        GUICtrlSetGraphic(-1, $GUI_GR_MOVE, 0, $i)
        GUICtrlSetGraphic(-1, $GUI_GR_LINE, $nWidth, $i)
    Next
EndFunc
Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
    $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, $iColor1, $iColor2, $iColor3
                    $iDrawStage = DllStructGetData($tCustDraw, 'DrawStage')
                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW ;request custom drawing of items
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ;request drawing each cell separately
                    If Not BitAND($iDrawStage, $CDDS_SUBITEM) Then Return $CDRF_DODEFAULT
                    $iItem = DllStructGetData($tCustDraw, 'ItemSpec')
                    $iSubitem = DllStructGetData($tCustDraw, 'SubItem')
;~
                    Return $CDRF_NEWFONT
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func RGB2BGR($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc
Edited by dickep

Share this post


Link to post
Share on other sites



I guess I forgot to put a word in the above. I need the background to be light green. Not the text.

Share this post


Link to post
Share on other sites

I guess I forgot to put a word in the above. I need the background to be light green. Not the text.

;~                           DllStructSetData($tCustDraw, 'clrText', 0x5555DD)
                            DllStructSetData($tCustDraw, 'clrTextBk', 0xFFFF00)

Share this post


Link to post
Share on other sites

Thanks Zedna, but I am still confused.

How do I just do the first 2 columns of the 3 IF and ONLY IF the variable $chanSelected is "Yes"?

I looked over the thread you referenced, but I guess my feeble mind can't figure out how to put that to use in my app.

Again, thanks and hope you can understand that I am not an expert programmer, more of an advanced novice.

Share this post


Link to post
Share on other sites

Very simple way is to use global array and store $chanSelected yes/no state for each listview item into it.

Index of that array will be the same as listview item index.

In WM_NOTIFY you can find appropriate yes/no state from that array based on item index

and set appropriate color for subitems (of that particular item).

Now I have no time to write sample script for you ...

Share this post


Link to post
Share on other sites

dickep,

Add these few lines to your exiting code: :rip:

$iItem = DllStructGetData($tCustDraw, 'ItemSpec')
$iSubitem = DllStructGetData($tCustDraw, 'SubItem')

; ~~~~~~~~~~ NEW ~~~~~~~~~~~~~~~~

; Does the second column say "Yes"
If StringInStr(_GUICtrlListView_GetItemText($hListView, $iItem, 1), "Yes") Then
    ; Then colour the first 2 rows
    If $iSubitem <> 2 Then
        DllStructSetData($tCustDraw, 'clrTextBk', 0x88FF88)
    Else
        DllStructSetData($tCustDraw, 'clrTextBk', 0xFEFEFE)
    EndIf
EndIf

; ~~~~~~~~~~ NEW ~~~~~~~~~~~~~~~~

Return $CDRF_NEWFONT

That works for me. :oops:

Thanks for the question - I learnt a lot about colouring ListViews today. :D

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

Thanks both Zedna and Melba. Melba, your help made this work. I also learned a lot from doing this "project"

Thanks hugely to all

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