Sign in to follow this  
Followers 0
gcue

refresh listview

4 posts in this topic

#1 ·  Posted (edited)

hello

i am changing colors of listview items via wm_notify after they have been drawn but the color change wont appear until i scroll away and back to the item.  is there any way to refresh the listview somehow so i can see the change immediately?  thanks in advance!!!  (credit to AutoBert/BugFix for the original example provided)

;Original von BugFix http://www.autoit.de/index.php?page=Thread&postID=173432#post173432
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <array.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>

;create arrays for listview index items changing colors
Global $untagged_array[1][2], $unsaved_array[1][2], $partly_tagged_array[1][2], $fully_tagged_array[2][2]

;define which listview items will change colors
$untagged_array[0][0] = "2"
$untagged_array[0][1] = "0xFAFAFA"

$unsaved_array[0][0] = "4"
$unsaved_array[0][1] = "0xFF0000"

$partly_tagged_array[0][0] = "1"
$partly_tagged_array[0][1] = "0xFFD700"

$fully_tagged_array[0][0] = "0"
$fully_tagged_array[0][1] = "0x00FF00"


$GUI = GUICreate("Listview", 1024, 300, 0, 0)
$cListView = GUICtrlCreateListView("", 2, 2, 1020, 294, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
$hListView = GUICtrlGetHandle($cListView)
For $i = 1 To 31
    _GUICtrlListView_InsertColumn($hListView, $i - 1, $i, 25)
    _GUICtrlListView_SetColumnWidth($hListView, $i - 1, 32)
Next
For $i = 0 To 21
    _GUICtrlListView_AddItem($hListView, "", $i)
    For $j = 0 To 30
        _GUICtrlListView_AddSubItem($hListView, $i, "", $j)
    Next
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

;;;;;;;;;;;at this point all is working normally

;pause before making an additional color change
msgbox(0,"","pause")

;make additional color change
$fully_tagged_array[1][0] = "7"
$fully_tagged_array[1][1] = "0x00FF00"


;;;;;;;;; last color change (done after pause) doesnt show.. BUT will show if you scroll all the way down the listview then back up to the item

While True
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            ExitLoop
    EndSwitch
WEnd
Exit

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
                    Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $iDrawStage, $iItem, $iSubitem, $hDC, $tRect
                    $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage')
                    Switch $iDrawStage
                        Case $CDDS_ITEMPREPAINT
                            Return $CDRF_NOTIFYSUBITEMDRAW
                        Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
                            $iItem = DllStructGetData($tCustDraw, 'dwItemSpec')
                            Switch $iItem ; Rows
                                Case -1
                                Case Else
                                    $iIndex = _ArraySearch($untagged_array, String($iItem), 0, 0, 0, 0, 0, 0)
                                    If $iIndex <> -1 Then
                                        DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR($untagged_array[$iIndex][1]))
                                    EndIf

                                    $iIndex = _ArraySearch($unsaved_array, String($iItem), 0, 0, 0, 0, 0, 0)
                                    If $iIndex <> -1 Then
                                        DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR($unsaved_array[$iIndex][1]))
                                    EndIf

                                    $iIndex = _ArraySearch($partly_tagged_array, String($iItem), 0, 0, 0, 0, 0, 0)
                                    If $iIndex <> -1 Then
                                        DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR($partly_tagged_array[$iIndex][1]))
                                    EndIf

                                    $iIndex = _ArraySearch($fully_tagged_array, String($iItem), 0, 0, 0, 0, 0, 0)
                                    If $iIndex <> -1 Then
                                        DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR($fully_tagged_array[$iIndex][1]))
                                    EndIf
                            EndSwitch
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

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

 

Edited by gcue

Share this post


Link to post
Share on other sites



sorry moderators, i accidentally posted in wrong section - can you please move this topic to AutoIt General Help and Support

thanks!

Share this post


Link to post
Share on other sites

worked great!

thank youuuu!

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