Jump to content

Recommended Posts

Posted (edited)

 

Hi Community,

I have a problem with the usage of _GUICtrlTreeView_AddChild and setting different item text colors (and different background colors), separately for the TreeView levels.

I use the UDF GUITreeViewEx.au3 of 'Melba23' and I renamed the functions to increase my understanding about the content. I already talked to him about his UDF to respect his rights and intellectual property. I read many forum threads, I tried many ways to get it, but it's seems to be impossible in the way that I use the UDF.

Question:
How can I set different item text colors, separately for the TreeView levels?
How can I set different item background colors, separately for the TreeView levels?

I found out that _GUICtrlTreeView_AddChild don't let my set this properties directly. But after loading the TreeView content I can't change the items (children) too. Only the font weight to bold I could set with _GUICtrlTreeView_SetBold but I want to do this in a generic way directly at the creation (loading) of the TreeView.

Of course I tried the different functions to set text color or bkgColor, but it didn't work - maybe I do it wrong.
I really hope you can help me, give me a hint and understand what I want to do.

[Solved] final solution made by @LarsJ (see below)

Thanks for your help - I'm grateful!
Sven


CODE

  Reveal hidden contents

BEFORE

  Reveal hidden contents

AFTER

  Reveal hidden contents

ExecutionPlan.zipFetching info...

Edited by Sven-Seyfert
Posted

Mr. Sven-Seyfert, You do it this way:

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

; compiler informations for AutoIt
#AutoIt3Wrapper_Icon=..\Examples\Libraries\icon.ico
#AutoIt3Wrapper_Res_Description=ExecutionPlan (2018-05-11)
#AutoIt3Wrapper_Res_Fileversion=0.2
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y



; includes ---------------------------------------------------------------------
#include-once
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>



; opt and just singleton -------------------------------------------------------
Opt( 'MustDeclareVars', 1 )
Global $aInst = ProcessList( 'ExecutionPlan.exe' )
If $aInst[0][0] > 1 Then Exit



; declaration ------------------------------------------------------------------
Global $sFileConfig              = @ScriptDir & '\ExecutionPlan_Config.ini'

Global $aSection1                = IniReadSection( $sFileConfig, 'Section1' )
Global $aSection2                = IniReadSection( $sFileConfig, 'Section2' )
Global $aSection3                = IniReadSection( $sFileConfig, 'Section3' )
Global $aSection4                = IniReadSection( $sFileConfig, 'Section4' )

Global $bCheck                   = True
Global $hItemSelected            = 0
Global $aTreeViewDataArray[1][2] = [[0, 0]]
Global $sTreeViewData



; gui --------------------------------------------------------------------------
Global $hMainGui      = GUICreate( 'ExecutionPlan', 625, 700 )
Global $cTreeView     = GUICtrlCreateTreeView( 0, 0, 625, 630, BitOR( $GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES ) )
Global $cBtnAllOrNone = GUICtrlCreateButton( '', 10, 640, 50, 50, $BS_ICON )
Global $cBtnRun       = GUICtrlCreateButton( '', 70, 640, 50, 50, $BS_ICON )
Global $cBtnExit      = GUICtrlCreateButton( '', 565, 640, 50, 50, $BS_ICON )

GUICtrlSetImage( $cBtnAllOrNone, 'shell32.dll', 274, 1 )
GUICtrlSetImage( $cBtnRun,       'shell32.dll', 25, 1 )
GUICtrlSetImage( $cBtnExit,      'shell32.dll', 28, 1 )

GUICtrlSetTip( $cBtnAllOrNone,   'Toggle Checkboxes' )
GUICtrlSetTip( $cBtnRun,         'Execute checked test scenarios' )
GUICtrlSetTip( $cBtnExit,        'Exit program' )



; functions --------------------------------------------------------------------
#include 'ExecutionPlan_Functions.au3'

; Register WM_NOTIFY message handler through subclassing
Global $pWM_NOTIFY = DllCallbackGetPtr( DllCallbackRegister( "WM_NOTIFY", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr" ) )
DllCall( "comctl32.dll", "bool", "SetWindowSubclass", "hwnd", $hMainGui, "ptr", $pWM_NOTIFY, "uint_ptr", 9999, "dword_ptr", GUICtrlGetHandle( $cTreeView ) ) ; $iSubclassId = 9999, $pData = $hTreeView


; processing -------------------------------------------------------------------
_appendTreeViewDataByIniSection( 'Section1|', $aSection1 )
_appendTreeViewDataByIniSection( 'Section2|', $aSection2 )
_appendTreeViewDataByIniSection( 'Section3|', $aSection3 )
_appendTreeViewDataByIniSection( 'Section4|', $aSection4 )

_loadTreeViewData( $cTreeView, StringTrimRight( $sTreeViewData, 1 ) )

_GUICtrlTreeView_Expand( $cTreeView )

_setParentTextToBold( 'Section1' )
_setParentTextToBold( 'Section2' )
_setParentTextToBold( 'Section3' )
_setParentTextToBold( 'Section4' )

GUISetState( @SW_SHOW, $hMainGui )

GUIRegisterMsg( $WM_NOTIFY, '_treeView_WM_NOTIFY_Handler' )
_createArrayOfCurrentCheckboxState( $cTreeView )

While 1
    Global $eMsg = GUIGetMsg()

    Switch $eMsg
        Case $GUI_EVENT_CLOSE, $cBtnExit
            ; Remove WM_NOTIFY message handler
            DllCall( "comctl32.dll", "bool", "RemoveWindowSubclass", "hwnd", $hMainGui, "ptr", $pWM_NOTIFY, "uint_ptr", 9999 )
            _disposeAndExit( $cTreeView )
        Case $cBtnAllOrNone
            If $bCheck Then
                _toggleCheckboxes( $cTreeView, $bCheck )
                $bCheck = False
            Else
                _toggleCheckboxes( $cTreeView, $bCheck )
                $bCheck = True
            EndIf
        Case $cBtnRun
            Global $aData = _getDataAsArray( $cTreeView )
            _ArrayDisplay( $aData )
    EndSwitch

    _changeParentsAndChildrenStateByCheckboxChanges()
WEnd

Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam, $iSubclassId, $hTreeView ) ; $pData = $hTreeView
  If $iMsg <> $WM_NOTIFY Then Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0]

  Local $tStruct  = DllStructCreate( _
    'struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;' & _
    'uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;' & _
    'ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;' & _
    'struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;' & _
    'ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;' & _
    'struct;long PointX;long PointY;endstruct', $lParam )

  If DllStructGetData( $tStruct, 'hWndFrom' ) <> HWnd( $hTreeView ) Then _
    Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0]

  Switch DllStructGetData( $tStruct, 'Code' )
    Case $NM_CUSTOMDRAW
      Local $tNMTVCUSTOMDRAW = DllStructCreate($tagNMTVCUSTOMDRAW, $lParam)
      Local $dwDrawStage = DllStructGetData($tNMTVCUSTOMDRAW, "DrawStage")
      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 $iLevel = 0, $hItem = DllStructGetData($tNMTVCUSTOMDRAW, "ItemSpec")
          Local $iState = DllStructGetData($tNMTVCUSTOMDRAW, "ItemState")
          If Not $hItem Or BitAnd( $iState, $CDIS_FOCUS ) Then Return $CDRF_NEWFONT
          While $hItem And $iLevel < 3
            $hItem = _SendMessage(HWnd( $hTreeView ), $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem, 0, "wparam", "handle", "handle")
            $iLevel += 1
          WEnd
          Switch $iLevel
            Case 1
              DllStructSetData( $tNMTVCUSTOMDRAW, "ClrText", ColorConvert(0xFFFFFF) )   ; Forecolor of item text
              DllStructSetData( $tNMTVCUSTOMDRAW, "clrTextBk", ColorConvert(0x006400) )  ; Backcolor of item text
            Case 2
              DllStructSetData( $tNMTVCUSTOMDRAW, "ClrText", ColorConvert(0xFFFFFF) )   ; Forecolor of item text
              DllStructSetData( $tNMTVCUSTOMDRAW, "clrTextBk", ColorConvert(0x008B8B) )  ; Backcolor of item text
          EndSwitch
          Return $CDRF_NEWFONT        ; $CDRF_NEWFONT must be returned after changing font or colors
      EndSwitch
  EndSwitch

  Return DllCall( "comctl32.dll", "lresult", "DefSubclassProc", "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam )[0]
  #forceref $iSubclassId
EndFunc

;RGB to BGR or BGR to RGB
Func ColorConvert($iColor)
  Return BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
EndFunc

 

Posted (edited)

Hi @LarsJ,

that's amazing. Honestly I couldn't do that way on my own. It's a bit too much of DLLStructs, which is a complex topic for me.
But I'm really grateful for your help and great solution.

Thanks for your help - I'm grateful!
Sven

Edited by Sven-Seyfert

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
×
×
  • Create New...