rootx

listview color selected item [SOLVED]

33 posts in this topic

#1 ·  Posted (edited)

How can I change dynamically the background colors of the selected Item? THX

I try with...

#include <ListBoxConstants.au3>
#include <GuiListBox.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>

Global $hListView

#Region ### START Koda GUI section ### Form=

$Form1 = GUICreate("Form1", 615, 437, 192, 124)
 GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF) ; will change background color

     $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150) ;,$LVS_SORTDESCENDING)

                        _GUICtrlListView_SetBkColor($idListview, 0xff0000)
                        _GUICtrlListView_SetTextBkColor($idListview, 0xff0000)
                        _GUICtrlListView_SetTextColor($idListview, 0x0000FF00)

     $idButton = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
     $idItem1 = GUICtrlCreateListViewItem("item1|col22|col23", $idListview)
     $idItem2 = GUICtrlCreateListViewItem("item2|col12|col13", $idListview)
     $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)
     $idItem4 = GUICtrlCreateListViewItem("item4|col32|col33", $idListview)
     $idItem5 = GUICtrlCreateListViewItem("item5|col32|col33", $idListview)
     $idItem9 = GUICtrlCreateListViewItem("item6|col32|col33", $idListview)
        GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop


        EndSwitch
    WEnd


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)

    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $idListview
    If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode

                Case $NM_CLICK ; The user has clicked the left mouse button within the control
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)

                    $Index = DllStructGetData($tInfo, "Index")
                    $ctrlID = _GUICtrlListView_GetItemParam($idListview,$Index)

                        Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"), 0)
                        ConsoleWrite($iItemText&@CRLF)

                        _GUICtrlListView_SetTextBkColor($idListview, 0x2E8B57)

                        ;If BitAND(GUICtrlRead($idListview), $GUI_CHECKED) Then
                        ;   GUICtrlSetBkColor($ctrlID, 0xff0000)
                        ;Else
                        ;    GUICtrlSetBkColor($ctrlID, 0xffff00)
                        ;EndIf



            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIF

 

Edited by rootx

Share this post


Link to post
Share on other sites



I'm not sure what you're asking? Do you want to change the color of the currently highlighted item when you click it? Or do you want it to change when you press the button?

When I click an item in your code it changes the background color of that item, so aren't you already doing what you need?


UHJvZmVzc2lvbmFsIENvbXB1dGVyZXI=

Share this post


Link to post
Share on other sites

rrotx,

Take a look at my GUIListViewEx UDF (the link is in my sig) as that allows you to colour all the ListView items if required. Run Example 6: Use the "Save" and "Load" buttons to populate the RH ListView and then you can change the background colour of the selected item between blue and orange (obviously you could choose other colours if required).

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
1 hour ago, Melba23 said:

rrotx,

Take a look at my GUIListViewEx UDF (the link is in my sig) as that allows you to colour all the ListView items if required. Run Example 6: Use the "Save" and "Load" buttons to populate the RH ListView and then you can change the background colour of the selected item between blue and orange (obviously you could choose other colours if required).

M23

Thx, I tried example 6... but I'm not sure again,

#include <ListBoxConstants.au3>
#include <GuiListBox.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include "GUIListViewEx.au3"


#Region ### START Koda GUI section ### Form=

$Form1 = GUICreate("Form1", 615, 437, 192, 124)
 GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
    GUISetBkColor(0x00E0FFFF) ; will change background color

     $idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
    ; Set required colours for ListView elements - change = pink field
    Local $aSelCol[4] = [Default, "0xFFCCCC", Default, Default] ;<--------------------------------------------
    _GUIListViewEx_SetDefColours($idListview, $aSelCol)


     $idButton = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
     $idItem1 = GUICtrlCreateListViewItem("item1|col22|col23", $idListview)
     $idItem2 = GUICtrlCreateListViewItem("item2|col12|col13", $idListview)
     $idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)
     $idItem4 = GUICtrlCreateListViewItem("item4|col32|col33", $idListview)
     $idItem5 = GUICtrlCreateListViewItem("item5|col32|col33", $idListview)
     $idItem9 = GUICtrlCreateListViewItem("item6|col32|col33", $idListview)
     _GUIListViewEx_MsgRegister()
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    ; Loop until the user exits.
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idButton
            Local $aSelCol[4] = ["", "", "0x000000", "0xFF8000"] ;<--------------------------------------------
            _GUIListViewEx_SetDefColours($idListview, $aSelCol)



        EndSwitch
    WEnd


Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)

    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $idListview
    If Not IsHWnd($idListview) Then $hWndListView = GUICtrlGetHandle($idListview)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode

                Case $NM_CLICK ; The user has clicked the left mouse button within the control
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)

                    $Index = DllStructGetData($tInfo, "Index")
                    $ctrlID = _GUICtrlListView_GetItemParam($idListview,$Index)

                        Local $iItemText = _GUICtrlListView_GetItemText($idListview, DllStructGetData($tInfo, "Index"), 0)
                        ConsoleWrite($iItemText&@CRLF)

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIF

 

Share this post


Link to post
Share on other sites

rootx,

If you cannot be bothered to read about the UDF and correctly integrate it into your script, then it is hardly surprising that it does not work. I will see what I can do this evening.

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

rootx,

Try this:

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

#include "GUIListViewEx.au3"

$Form1 = GUICreate("Form1", 615, 437, 192, 124)

$idListview = GUICtrlCreateListView("col1  |col2|col3  ", 10, 10, 200, 150, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
_GUICtrlListView_SetExtendedListViewStyle($idListview, $LVS_EX_FULLROWSELECT)

$idButton = GUICtrlCreateButton("Value?", 75, 170, 70, 20)

$idItem1 = GUICtrlCreateListViewItem("item1|col22|col23", $idListview)
$idItem2 = GUICtrlCreateListViewItem("item2|col12|col13", $idListview)
$idItem3 = GUICtrlCreateListViewItem("item3|col32|col33", $idListview)
$idItem4 = GUICtrlCreateListViewItem("item4|col32|col33", $idListview)
$idItem5 = GUICtrlCreateListViewItem("item5|col32|col33", $idListview)
$idItem9 = GUICtrlCreateListViewItem("item6|col32|col33", $idListview)

$aLVArray = _GUIListViewEx_ReadToArray($idListview)

$iLV_Index = _GUIListViewEx_Init($idListview, $aLVArray, 0, 0, True, 32 + 512)

; Set required colours for ListView elements - change = pink field when selected
Local $aSelCol[4] = [Default, Default, Default, "0xFFCCCC"]
_GUIListViewEx_SetDefColours($iLV_Index, $aSelCol)

_GUIListViewEx_MsgRegister(False)
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState(@SW_SHOW)

; Loop until the user exits.
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    ; Struct = $tagNMHDR and "int Item;int SubItem" from $tagNMLISTVIEW
    Local $tStruct = DllStructCreate("hwnd;uint_ptr;int_ptr;int;int", $lParam)
    If Not @error Then

        Local $hLV = DllStructGetData($tStruct, 1)
        Local $iItem = DllStructGetData($tStruct, 4)
        Local $iSubItem = DllStructGetData($tStruct, 5)
        Local $iCode = BitAND(DllStructGetData($tStruct, 3), 0xFFFFFFFF)

        If $iCode = $NM_CLICK Then
            $sText = _GUICtrlListView_GetItemText($hLV, $iItem, $iSubItem)
            ConsoleWrite($sText & @CRLF)
        EndIf
    EndIf

    $iRet = _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $wParam, $lParam)

    Return $iRet

EndFunc

M23

1 person likes this

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

Melba, I read the word file, and the script 6, I have extracted the function I was thinking of using in my purpose, I have not much experience with listview mea culpa. Thx

Share this post


Link to post
Share on other sites

rootx,

No problem, it is a complex UDF to understand - it took even me a couple of goes to get it working!

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
#include <Misc.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ListBoxConstants.au3>
#include <GuiListBox.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <StaticConstants.au3>
#include <GuiImageList.au3>
#include <GuiStatusBar.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <Date.au3>
#include <IE.au3>
#include "GUIListViewEx.au3"

HotKeySet("{ESC}", "On_Exit")

Global $bChanged

DirCreate(@DesktopDir&"\img")
DirCreate(@DesktopDir&"\ico")

;Graphics
Global $icod = @ScriptDir & "\img\defico.jpg"
Global $bg = @ScriptDir & "\img\def.jpg"
Global $ini = @ScriptDir & "\ini.ini"

For $z = 1 to 4
    IniWriteSection($ini,@ScriptDir&"\data\"&$z,"")
Next

$sect = IniReadSectionNames($ini)

For $s = 1 To UBound($sect) - 1
    IniWrite($ini,$sect[$s],"name",$s)
    IniWrite($ini,$sect[$s],"img",@ScriptDir&"\img\"&$s&".jpg")
    IniWrite($ini,$sect[$s],"icon",@ScriptDir&"\ico\"&$s&".ico")
    IniWrite($ini,$sect[$s],"background",@ScriptDir&"\img\"&$s&".jpg")
Next

$GUIH="600"
$GUIW="1024"
$LsX="172"
$LsY="33"
$LsW="340"
$LsH="481"

$Xcolor = "0x0000FFFF"
$Xfcolor = "0x0000FFFF"

_GDIPlus_Startup()

$Form1 = GUICreate("My LIB", 1024, 600, -1, -1)
GUICtrlSetDefColor($Xfcolor)
GUICtrlSetDefBkColor($Xcolor)

$Pic2 = GUICtrlCreatePic($bg, 820, 10, 200, 200, BitOR($GUI_SS_DEFAULT_PIC, $SS_CENTERIMAGE, $SS_SUNKEN, $WS_BORDER))
;Create listview
$hListView = _GUICtrlListView_Create($Form1, "", 0, 0, 320, 600)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_AUTOARRANGE, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER, $LVS_EX_SUBITEMIMAGES))
; block resizing of columns
ControlDisable($Form1, "", HWnd(_GUICtrlListView_GetHeader($hListView)))

_GUICtrlListView_SetBkColor($hListView, $Xcolor)
_GUICtrlListView_SetTextBkColor($hListView, $Xcolor)
_GUICtrlListView_SetTextColor($hListView, 0x0000000)

;Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "", 320)
_GUICtrlListView_InsertColumn($hListView, 1, "Path", 0)

_GUIListViewEx_MsgRegister(False) ;<---------------------------------------

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

GUISetState(@SW_SHOW)

;Slide Effect
Global $hGfx = _GDIPlus_GraphicsCreateFromHWND($Form1)
;clip control elements
Global $hRegion = _GDIPlus_RegionCreateFromRect(0, 0, $guiw, $guih)
Global $hChild = _WinAPI_GetWindow($Form1, $GW_CHILD)
Global $aRect
Do
    $aRect = ControlGetPos($hChild, "", 0)
    _GDIPlus_RegionCombineRect($hRegion, $aRect[0], $aRect[1], $aRect[2], $aRect[3], 3)
    $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
Until Not $hChild
_GDIPlus_GraphicsSetClipRegion($hGfx, $hRegion)
_GDIPlus_RegionDispose($hRegion)
Global $hBmp1 = _GDIPlus_ImageLoadFromFile($bg)
_GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp1, 0, 0, $guiw, $guih)

read()

_GUICtrlListView_RegisterSortCallBack($hListView)

While 1
    If $bChanged Then
        Local $n = 1, $guihx = $guih + 50
        $itemc = _GUICtrlListView_GetSelectedIndices($hListView,false)
        Local $iItemTextd = _GUICtrlListView_GetItemText($hListView, $itemc, 1)
        $background = IniRead($ini, $iItemTextd, "background", "")
        If FileExists($background) Then
            Local $hBmp3 = _GDIPlus_ImageLoadFromFile(IniRead($ini, $iItemTextd, "background", ""))
            For $x = -$guiw To 0 Step 50
                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp3, 0, $x, $guiw, $guihx)
            Next
            _GDIPlus_ImageDispose($hBmp3)
        Else
            Local $hBmp3 = _GDIPlus_ImageLoadFromFile($bg)
            For $x = -$guiw To 0 Step 50
                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp3, 0, $x, $guiw, $guihx)
            Next
            _GDIPlus_ImageDispose($hBmp3)
        EndIf
        $pics = IniRead($ini, $iItemTextd, "img", "")
            If FileExists($pics) Then
                GUICtrlSetImage($Pic2, $pics)
            Else
                GUICtrlSetImage($Pic2, $icod)
            EndIf
        $bChanged = False
    EndIf

    $aMsg = GUIGetMsg(1)
    Switch $aMsg[1]
        Case $Form1
            Switch $aMsg[0]
                Case $GUI_EVENT_CLOSE
                    _GDIPlus_ImageDispose($hBmp1)
                    _GDIPlus_GraphicsDispose($hGfx)
                    _GDIPlus_Shutdown()
            EndSwitch
    EndSwitch
WEnd

; ========================================================
; This thing is responcible for click events
; ========================================================
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)

    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom

        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; The user has clicked the left mouse button within the control
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $Index = DllStructGetData($tInfo, "Index")
                    If DllStructGetData($tInfo, "Index") = -1 Then
                        ;ConsoleWrite("no item" & @CRLF)
                    Else

                        Local $iItemText = _GUICtrlListView_GetItemText($hListView, DllStructGetData($tInfo, "Index"), 1)
                        $pics = IniRead($ini, $iItemText, "img", "")
                        If FileExists($pics) Then
                            GUICtrlSetImage($Pic2, $pics)
                        Else
                            GUICtrlSetImage($Pic2, $icod)
                        EndIf
                        $item = StringSplit(_GUICtrlListView_GetItemTextString($hListView, $Index), '|')
                        $itemx = $item[1]
                        $item2 = IniRead($ini, $iItemText, "background", "")
                        Local $n = 1, $guihx = $guih + 50
                        If FileExists($item2) Then
                            Local $hBmp2 = _GDIPlus_ImageLoadFromFile(IniRead($ini, $iItemText, "background", ""))
                            For $x = -$guiw To 0 Step 50
                                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp2, 0, $x, $guiw, $guihx)
                            Next
                            _GDIPlus_ImageDispose($hBmp2)
                        Else
                            Local $hBmp2 = _GDIPlus_ImageLoadFromFile($bg)
                            For $x = -$guiw To 0 Step 50
                                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp2, 0, $x, $guiw, $guihx)
                            Next
                            _GDIPlus_ImageDispose($hBmp2)
                        EndIf
                    EndIf

                Case $LVN_KEYDOWN
                    $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
                    $iKey = DllStructGetData($tInfo, "VKey")
                    Switch $iKey
                        Case 38, 40
                            $bChanged = True
                    EndSwitch
            EndSwitch
    EndSwitch

            $iRet = _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $iwParam, $ilParam);<---------------------------------------
            Return $iRet;<---------------------------------------

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit

Func read()
    Local $tot = 0
    If FileExists($ini) Then
        $hImage = _GUIImageList_Create(48, 48, 5, 1)
        _GDIPlus_Startup()
        $aArrays = IniReadSectionNames($ini)
        _ArrayColInsert($aArrays, 1)
        For $s = 1 To UBound($aArrays) - 1
            $aArrays[$s][1] = StringRegExp($aArrays[$s][0], '.*\\(.*)\\', 1)[0]
        Next
        _ArrayColDelete($aArrays, 1, True)
        If Not @error Then
            For $i = 1 To UBound($aArrays) - 1
                $n = IniRead($ini, $aArrays[$i], "name", "")
                $z = IniRead($ini, $aArrays[$i], "icon", "")
                ;load icon and upscale the icon to 48x48 pixels
                $hBitmap = _GDIPlus_BitmapCreateFromFile($z)
                $hBitmap_scaled = _GDIPlus_ImageResize($hBitmap, 48, 48)
                $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_scaled)
                _GDIPlus_BitmapDispose($hBitmap_scaled)
                _GDIPlus_BitmapDispose($hBitmap)
                $ico = _GUIImageList_Add($hImage, $hBitmap_GDI)
                _GUICtrlListView_SetImageList($hListView, $hImage, 1)
                _GUICtrlListView_AddItem($hListView, $n, $ico)
                _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArrays[$i], 1)
                $tot += 1
            Next

                $aLVArray = _GUIListViewEx_ReadToArray($hListView);<---------------------------------------
                $iLV_Index = _GUIListViewEx_Init($hListView, $aLVArray, 0, 0, True, 32 + 512);<---------------------------------------
                ; Set required colours for ListView elements - change = pink field when selected;<---------------------------------------
                Local $aSelCol[4] = [Default, Default, Default, "0xFFCCCC"];<---------------------------------------
                _GUIListViewEx_SetDefColours($iLV_Index, $aSelCol);<---------------------------------------


            _GDIPlus_Shutdown()
        EndIf
    EndIf
EndFunc   ;==>read

 

img.zip

Share this post


Link to post
Share on other sites

#10 ·  Posted

Hi,

For anyone wondering about the enigmatic code posted above, I received a PM stating:

Quote

when I try to use the keyboard .. UP DOWN arrow does not work, the images do not change anymore, it only works the click event

Now the code is in open forum I am looking at it.

A timely reminder that the Forum rules are quite clear about asking for help via PM - DO NOT DO IT!

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

#11 ·  Posted

rootx,

Looking at the code I see that you are using images within the ListView. My UDF does not cater for this and so there is no way it can be integrated into your script.

This is yet another example of a thread where the original question does not explain the full extent of the requirement, leading to a lot of wasted time as possible solutions are proposed which subsequently turn out to be far from what is actually  required. It is always a good idea to explain what is needed in as much detail as possible when starting a thread - then those who offer help can at least be sure that they are not wasting their time.

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

#12 ·  Posted

1 hour ago, Melba23 said:

rootx,

Looking at the code I see that you are using images within the ListView. My UDF does not cater for this and so there is no way it can be integrated into your script.

This is yet another example of a thread where the original question does not explain the full extent of the requirement, leading to a lot of wasted time as possible solutions are proposed which subsequently turn out to be far from what is actually  required. It is always a good idea to explain what is needed in as much detail as possible when starting a thread - then those who offer help can at least be sure that they are not wasting their time.

M23

THX M23, your UDF works fine with the click event, and change the picture and color of the selected text line. My specific problem is when I use the keybinding $LVN_KEYDOWN.

So, I hope someone have one idea to solve or to show me where I must look in the Autoit Helpline Functions.

Thx you all

Share this post


Link to post
Share on other sites

#13 ·  Posted

rootx,

I am really surprised to hear that you get the UDF to work with that ListView. I have looked a the code and I cannot see a problem - I will look again this afternoon after my Spanish lesson.

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

#14 ·  Posted

11 minutes ago, Melba23 said:

rootx,

I am really surprised to hear that you get the UDF to work with that ListView. I have looked a the code and I cannot see a problem - I will look again this afternoon after my Spanish lesson.

M23

THX, I found this 4now https://msdn.microsoft.com/en-us/library/bb775483(v=vs.85).aspx

Share this post


Link to post
Share on other sites

#15 ·  Posted

rootx,

That is what the UDF uses to do the colouring.

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

#16 ·  Posted (edited)

Hi guys I tried with the udf melba and even without it I can only using the click event, someone could explain to me why when I use $ LVN_KEYDOWN the image is not updated? Thank you.

#include <Misc.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ListBoxConstants.au3>
#include <GuiListBox.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <File.au3>
#include <FileConstants.au3>
#include <StaticConstants.au3>
#include <GuiImageList.au3>
#include <GuiStatusBar.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <Date.au3>
#include <IE.au3>
#include "GUIListViewEx.au3"

HotKeySet("{ESC}", "On_Exit")

Global $bChanged

DirCreate(@DesktopDir&"\img")
DirCreate(@DesktopDir&"\ico")

;Graphics
Global $icod = @ScriptDir & "\img\defico.jpg"
Global $bg = @ScriptDir & "\img\def.jpg"
Global $ini = @ScriptDir & "\ini.ini"

For $z = 1 to 4
    IniWriteSection($ini,@ScriptDir&"\data\"&$z,"")
Next

$sect = IniReadSectionNames($ini)

For $s = 1 To UBound($sect) - 1
    IniWrite($ini,$sect[$s],"name",$s)
    IniWrite($ini,$sect[$s],"img",@ScriptDir&"\img\"&$s&".jpg")
    IniWrite($ini,$sect[$s],"icon",@ScriptDir&"\ico\"&$s&".ico")
    IniWrite($ini,$sect[$s],"background",@ScriptDir&"\img\"&$s&".jpg")
Next

$GUIH="600"
$GUIW="1024"
$LsX="172"
$LsY="33"
$LsW="340"
$LsH="481"

$Xcolor = "0x0000FFFF"
$Xfcolor = "0x0000FFFF"

_GDIPlus_Startup()

$Form1 = GUICreate("My LIB", 1024, 600, -1, -1)
GUICtrlSetDefColor($Xfcolor)
GUICtrlSetDefBkColor($Xcolor)

$Pic2 = GUICtrlCreatePic($bg, 820, 10, 200, 200, BitOR($GUI_SS_DEFAULT_PIC, $SS_CENTERIMAGE, $SS_SUNKEN, $WS_BORDER))
;Create listview
$hListView = _GUICtrlListView_Create($Form1, "", 0, 0, 320, 600)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_AUTOARRANGE, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER, $LVS_EX_SUBITEMIMAGES))
; block resizing of columns
ControlDisable($Form1, "", HWnd(_GUICtrlListView_GetHeader($hListView)))

_GUICtrlListView_SetBkColor($hListView, $Xcolor)
_GUICtrlListView_SetTextBkColor($hListView, $Xcolor)
_GUICtrlListView_SetTextColor($hListView, 0x0000000)

;Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "", 320)
_GUICtrlListView_InsertColumn($hListView, 1, "Path", 0)

_GUIListViewEx_MsgRegister(False) ;<---------------------------------------

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

GUISetState(@SW_SHOW)

;Slide Effect
Global $hGfx = _GDIPlus_GraphicsCreateFromHWND($Form1)
;clip control elements
Global $hRegion = _GDIPlus_RegionCreateFromRect(0, 0, $guiw, $guih)
Global $hChild = _WinAPI_GetWindow($Form1, $GW_CHILD)
Global $aRect
Do
    $aRect = ControlGetPos($hChild, "", 0)
    _GDIPlus_RegionCombineRect($hRegion, $aRect[0], $aRect[1], $aRect[2], $aRect[3], 3)
    $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
Until Not $hChild
_GDIPlus_GraphicsSetClipRegion($hGfx, $hRegion)
_GDIPlus_RegionDispose($hRegion)
Global $hBmp1 = _GDIPlus_ImageLoadFromFile($bg)
_GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp1, 0, 0, $guiw, $guih)

read()

_GUICtrlListView_RegisterSortCallBack($hListView)

While 1
    If $bChanged Then
        Local $n = 1, $guihx = $guih + 50
        $itemc = _GUICtrlListView_GetSelectedIndices($hListView,false)
        Local $iItemTextd = _GUICtrlListView_GetItemText($hListView, $itemc, 1)
        $background = IniRead($ini, $iItemTextd, "background", "")
        If FileExists($background) Then
            Local $hBmp3 = _GDIPlus_ImageLoadFromFile(IniRead($ini, $iItemTextd, "background", ""))
            For $x = -$guiw To 0 Step 50
                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp3, 0, $x, $guiw, $guihx)
            Next
            _GDIPlus_ImageDispose($hBmp3)
        Else
            Local $hBmp3 = _GDIPlus_ImageLoadFromFile($bg)
            For $x = -$guiw To 0 Step 50
                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp3, 0, $x, $guiw, $guihx)
            Next
            _GDIPlus_ImageDispose($hBmp3)
        EndIf
        $pics = IniRead($ini, $iItemTextd, "img", "")
            If FileExists($pics) Then
                GUICtrlSetImage($Pic2, $pics)
            Else
                GUICtrlSetImage($Pic2, $icod)
            EndIf
        $bChanged = False
    EndIf

    $aMsg = GUIGetMsg(1)
    Switch $aMsg[1]
        Case $Form1
            Switch $aMsg[0]
                Case $GUI_EVENT_CLOSE
                    _GDIPlus_ImageDispose($hBmp1)
                    _GDIPlus_GraphicsDispose($hGfx)
                    _GDIPlus_Shutdown()
            EndSwitch
    EndSwitch
WEnd

; ========================================================
; This thing is responcible for click events
; ========================================================
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)

    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom

        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK ; The user has clicked the left mouse button within the control
                    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $Index = DllStructGetData($tInfo, "Index")
                    If DllStructGetData($tInfo, "Index") = -1 Then
                        ;ConsoleWrite("no item" & @CRLF)
                    Else

                        Local $iItemText = _GUICtrlListView_GetItemText($hListView, DllStructGetData($tInfo, "Index"), 1)
                        $pics = IniRead($ini, $iItemText, "img", "")
                        If FileExists($pics) Then
                            GUICtrlSetImage($Pic2, $pics)
                        Else
                            GUICtrlSetImage($Pic2, $icod)
                        EndIf
                        $item = StringSplit(_GUICtrlListView_GetItemTextString($hListView, $Index), '|')
                        $itemx = $item[1]
                        $item2 = IniRead($ini, $iItemText, "background", "")
                        Local $n = 1, $guihx = $guih + 50
                        If FileExists($item2) Then
                            Local $hBmp2 = _GDIPlus_ImageLoadFromFile(IniRead($ini, $iItemText, "background", ""))
                            For $x = -$guiw To 0 Step 50
                                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp2, 0, $x, $guiw, $guihx)
                            Next
                            _GDIPlus_ImageDispose($hBmp2)
                        Else
                            Local $hBmp2 = _GDIPlus_ImageLoadFromFile($bg)
                            For $x = -$guiw To 0 Step 50
                                _GDIPlus_GraphicsDrawImageRect($hGfx, $hBmp2, 0, $x, $guiw, $guihx)
                            Next
                            _GDIPlus_ImageDispose($hBmp2)
                        EndIf
                    EndIf

                Case $LVN_KEYDOWN
                    $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
                    $iKey = DllStructGetData($tInfo, "VKey")
                    Switch $iKey
                        Case 38, 40
                            $bChanged = True
                    EndSwitch
            EndSwitch
    EndSwitch

            $iRet = _GUIListViewEx_WM_NOTIFY_Handler($hWnd, $iMsg, $iwParam, $ilParam);<---------------------------------------
            Return $iRet;<---------------------------------------

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST

Func On_Exit()
    Exit
EndFunc   ;==>On_Exit

Func read()
    Local $tot = 0
    If FileExists($ini) Then
        $hImage = _GUIImageList_Create(48, 48, 5, 1)
        _GDIPlus_Startup()
        $aArrays = IniReadSectionNames($ini)
        _ArrayColInsert($aArrays, 1)
        For $s = 1 To UBound($aArrays) - 1
            $aArrays[$s][1] = StringRegExp($aArrays[$s][0], '.*\\(.*)\\', 1)[0]
        Next
        _ArrayColDelete($aArrays, 1, True)
        If Not @error Then
            For $i = 1 To UBound($aArrays) - 1
                $n = IniRead($ini, $aArrays[$i], "name", "")
                $z = IniRead($ini, $aArrays[$i], "icon", "")
                ;load icon and upscale the icon to 48x48 pixels
                $hBitmap = _GDIPlus_BitmapCreateFromFile($z)
                $hBitmap_scaled = _GDIPlus_ImageResize($hBitmap, 48, 48)
                $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_scaled)
                _GDIPlus_BitmapDispose($hBitmap_scaled)
                _GDIPlus_BitmapDispose($hBitmap)
                $ico = _GUIImageList_Add($hImage, $hBitmap_GDI)
                _GUICtrlListView_SetImageList($hListView, $hImage, 1)
                _GUICtrlListView_AddItem($hListView, $n, $ico)
                _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArrays[$i], 1)
                $tot += 1
            Next

                $aLVArray = _GUIListViewEx_ReadToArray($hListView);<---------------------------------------
                $iLV_Index = _GUIListViewEx_Init($hListView, $aLVArray, 0, 0, True, 32 + 512);<---------------------------------------
                ; Set required colours for ListView elements - change = pink field when selected;<---------------------------------------
                Local $aSelCol[4] = [Default, Default, Default, "0xFFCCCC"];<---------------------------------------
                _GUIListViewEx_SetDefColours($iLV_Index, $aSelCol);<---------------------------------------


            _GDIPlus_Shutdown()
        EndIf
    EndIf
EndFunc   ;==>read

 

img.zip

Edited by rootx

Share this post


Link to post
Share on other sites

#17 ·  Posted

Hello.... Is there someone who would have patience to help me,I tried with the udf melba and even without it I can only using the click event, someone could explain to me why when I use $ LVN_KEYDOWN the image is not updated?

THX.

Share this post


Link to post
Share on other sites

#18 ·  Posted (edited)

rootx,

Does no-one ever do any debugging of their own scripts nowadays? A few simple ConsoleWrites give the answer:

The reason the keys do not work is that the $itemc = _GUICtrlListView_GetSelectedIndices($hListView, False) line is returning nothing. As a result, the $iItemTextd = _GUICtrlListView_GetItemText($hListView, $itemc, 1) line always returns the same image path.

You will have to add some code to track which item is being selected by the keys rather than relying on the  _GUICtrlListView_GetSelectedIndices command. This is perhaps because my UDF is dealing with the colouring rather then leaving it to Windows - but do not hold your breath for me to amend it so that the command does return the correct value.

M23

Edit: You are in luck - the UDF should be able to do what you want and a new function is being prepared.

Edited by Melba23
1 person likes this

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

#19 ·  Posted

58 minutes ago, Melba23 said:

rootx,

Does no-one ever do any debugging of their own scripts nowadays? A few simple ConsoleWrites give the answer:

The reason the keys do not work is that the $itemc = _GUICtrlListView_GetSelectedIndices($hListView, False) line is returning nothing. As a result, the $iItemTextd = _GUICtrlListView_GetItemText($hListView, $itemc, 1) line always returns the same image path.

You will have to add some code to track which item is being selected by the keys rather than relying on the  _GUICtrlListView_GetSelectedIndices command. This is perhaps because my UDF is dealing with the colouring rather then leaving it to Windows - but do not hold your breath for me to amend it so that the command does return the correct value.

M23

Edit: You are in luck - the UDF should be able to do what you want and a new function is being prepared.

THX

Share this post


Link to post
Share on other sites

#20 ·  Posted

rootx,

This is working for me. Add this function to the end of your script:

; #FUNCTION# =========================================================================================================
; Name...........: _GUIListViewEx_GetLastSelectedItem
; Description ...: Get last selected item in active or specified ListView
; Syntax.........: _GUIListViewEx_GetLastSelectedItem($iLV_Index = 0)
; Parameters ....: $iLV_Index - Index of ListView as returned by _GUIListViewEx_Init
; Requirement(s).: v3.3.10 +
; Return values .: Success: Delimited string ListViewIndex|Row|Col
;                  Failure: Returns "" and sets @error as follows:
;                      1 = No ListView yet active or invalid index passed
;                      2 = No item selected in
; Author ........: Melba23
; Modified ......:
; Remarks .......: If multiple items are selected, only the last selected is returned
; Example........: Yes
;=====================================================================================================================
Func _GUIListViewEx_GetLastSelectedItem($iLV_Index = 0)

    ; Check valid index
    Switch $iLV_Index
        Case 1 To $aGLVEx_Data[0][0]
            ; Valid index
        Case Else
            ; Get active ListView
            $iLV_Index = _GUIListViewEx_GetActive()
            ; If no ListView active
            If $iLV_Index = 0 Then Return SetError(1, 0, "")
    EndSwitch

    ; Read last selected item
    Local $iRow = $aGLVEx_Data[$iLV_Index][20]
    Local $iCol = $aGLVEx_Data[$iLV_Index][21]
    ; Check selection has been made
    If $iRow = -1 Or $iCol = -1 Then Return SetError(2, 0, "")
    ; Return selection details
    Return $iLV_Index & "|" & $iRow & "|" & $iCol

EndFunc

Now amend the $LVN_KEYDOWN handler like this:

Case $LVN_KEYDOWN
                    $tInfo = DllStructCreate($tagNMLVKEYDOWN, $ilParam)
                    $iKey = DllStructGetData($tInfo, "VKey")
                    ; Get current selection
                    $aLastSel = StringSplit(_GUIListViewEx_GetLastSelectedItem(), "|")
                    Switch $iKey
                        Case 38
                            ; Move up unless at top
                            $iCurrItem = $aLastSel[2] - 1
                            If $iCurrItem < 0 Then
                                $iCurrItem = 0
                            EndIf
                            _GUICtrlListView_ClickItem($hWndFrom, $iCurrItem)
                        Case 40
                            ; Move down unless at bottom
                            $iCurrItem = $aLastSel[2] + 1
                            If $iCurrItem >= _GUICtrlListView_GetItemCount($hWndFrom) Then
                                $iCurrItem = _GUICtrlListView_GetItemCount($hWndFrom) - 1
                            EndIf
                            _GUICtrlListView_ClickItem($hWndFrom, $iCurrItem)
                    EndSwitch

And you can remove all the If $bChanged section from your idle loop as the handler clicking on the item sets of another pass through the handler as if you had used the mouse.

As I said, it works for me - does it for you?

M23

1 person likes this

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

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

  • Similar Content

    • mLipok
      By mLipok
      I was not lucky to find the right function so I created it by my self:
      _GUICtrlListView_GetColumnID_ByName()
      Example:
       
      #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <MsgBoxConstants.au3> Example() Func Example() GUICreate("ListView Get Column ID", 400, 300) Local $idListview = GUICtrlCreateListView("Alfa|Beta|Gama", 2, 2, 394, 268) GUISetState(@SW_SHOW) _GUICtrlListView_SetColumnOrder($idListview, "2|0|1") MsgBox($MB_SYSTEMMODAL, "Information", "Column ID: " & _GUICtrlListView_GetColumnID_ByName($idListview, 'Gama')) ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func _GUICtrlListView_GetColumnID_ByName($hListView, $sColumnToFind) Local $iColumn_Count = _GUICtrlListView_GetColumnCount($hListView) Local $aColumns For $iColumn_idx = 0 To $iColumn_Count - 1 $aColumns = _GUICtrlListView_GetColumn($hListView, $iColumn_idx) If $aColumns[5] = $sColumnToFind Then Return $iColumn_idx EndIf Next Return SetError(1, 0, -1) EndFunc ;==>_GUICtrlListView_GetColumnID_ByName  
    • UEZ
      By UEZ
      Here a small tool I wrote to update my Sysinternal tools collection without the need to download always the whole package or visiting the site to check for updates. I know that there are several tools available (also some tools written in AutoIt) but here another one for the collection. It was good exercise for me to code it.
       
       
        
       
       
      Some files from cannot be downloaded although they are visible on the web site!
       
      Here the download link of the source code only: AutoIt Sysinternal Tools Synchronizer v0.99.1 build 2017-10-23 beta.7z  (1353 downloads previously)
      -=> Requires AutoIt version 3.3.13.20 or higher / tested on Win8.1 real machine and some VMs: Win7 / Vista / Win10
       
      Compiled exe only: @MediaFire
       
      Just select the Sysinternal Tools folder or create one and press the synchronize button to download the selected items. Click on AutoIt label (near to left upper corner) to open menu.
       
      Special thanks to LarsJ, Melba23 and mesale0077 for their help. 
       
      I've still some ideas to implement which are more gimmick related, so it is not finished yet...
      If you want to add your language please check out #Region Language. Thanks. 
       
      Please report any bug or if you have any suggestions.
       
      The language of the tool tip from each of the executable in the left list view were automatically created using Google translator and weren't checked for correctness.
       
      Br,
      UEZ
    • 0Ethan0
      By 0Ethan0
      Ahoy Autoit Community!
      After many trials and errors I am unable to solve a problem I am facing and would appreciate any kind of input or better yet a solution 
      The Premise: An embeded slideshow viewer that runs after double-clicking an item in a ListView (each item will generate a different slideshow images).
      The Setup: GUI with a ListView Control and a simple exit button.
      The Issue: Once double clicked the slide plays however the GUI "locks"/non responsive until the slide is over. Same thing if I click on the "Test" button.
      The Culprit: I believe since it's in the images loop it can't accept any other commands until that loop is over.
      The Wish: I want to be able to use the GUI functions (selecting other items, clicking on button etc.) while the slideshow plays.
      The Code (stripped and simplified as much as I could):
      #include <GuiListView.au3> #include <File.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) HotKeySet("{Esc}", "_Exit") Global $c=0 Global $ssGDI[3], $ssGraphic[2], $ssImage Global Const $bg_color = "000000" Global Const $ssW = 480, $ssH = 320 Global $aFiles = _FileListToArrayRec("d:\testStage\", "*.jpg;*.png;*.bmp;*.gif;*.JPG;*.PNG;*.BMP;*.GIF", $FLTAR_FILES, $FLTAR_NORECUR ,$FLTAR_SORT ,$FLTAR_FULLPATH ) $guiW = 1200 $guiH = 726 $mainWindow = GUICreate("Slideshow Viewer", $guiW, $guiH, -1, -1, $WS_POPUP) $Button1 = GUICtrlCreateButton("Exit", 0, 0, 50, 50) GUICtrlSetOnEvent($Button1, "_Exit") $Button1 = GUICtrlCreateButton("Test", 60, 0, 50, 50) GUICtrlSetOnEvent($Button1, "Test") Global $ListView = GUICtrlCreateListView("Entry Name|Category", 5, 75, 195, 280) _GUICtrlListView_SetColumnWidth ($ListView, 0, 100) _GUICtrlListView_SetColumnWidth ($ListView, 1, 100) GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES) GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT) GUICtrlCreateListViewItem("Name 1|Category 1", $ListView) GUICtrlCreateListViewItem("Name 2|Category 2", $ListView) screenshotWidgetInit($ssW,$ssH, 690, 100) GUISetState(@SW_SHOW, $mainWindow) GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE _Exit() EndSwitch WEnd Func Test() For $k = 1 To UBound($aFiles) - 1 screenshotWidgetTransition($aFiles[$k]) Next EndFunc Func ListView_Click() ConsoleWrite("Left Click") EndFunc Func ListView_DoubleClick() ConsoleWrite("Double Left Click") Test() EndFunc Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam) #forceref $hWndGUI, $MsgID, $wParam Local $tagNMHDR, $event, $hwndFrom, $code $tagNMHDR = DllStructCreate("int;int;int", $lParam) If @error Then Return $event = DllStructGetData($tagNMHDR, 3) Select Case $wParam = $ListView Select Case $event = $NM_CLICK ListView_Click () Case $event = $NM_DBLCLK ListView_DoubleClick () EndSelect EndSelect Return $GUI_RUNDEFMSG EndFunc Func screenshotWidgetTransition($image, $delay = 0, $speed = 1, $sleep = 2000) Local $a, $d = $c, $iX, $iY $ssImage = _GDIPlus_ImageLoadFromFile($image) $iX = _GDIPlus_ImageGetWidth($ssImage) $iY = _GDIPlus_ImageGetHeight($ssImage) $FDesktop=$ssH/$ssW $Fact =1 If $iX > $ssW And $FDesktop > ($iY/$iX) Then $Fact=$ssW/$iX ElseIf $iY > $ssH Then $Fact=$ssH/$iY EndIf $H1 = Round(($Fact * $iY),0) $W1 = Round(($Fact * $iX),0) _GDIPlus_GraphicsDrawImageRect($ssGraphic[$d], $ssImage,($ssW - $W1)/2, ($ssH - $H1) / 2,$W1,$H1) WinSetTrans($ssGDI[$d], "", 0) WinSetOnTop($ssGDI[$d], "", 1) For $a = 0 To 254 Step $speed WinSetTrans($ssGDI[$d], "", $a) Sleep($delay) Next WinSetTrans($ssGDI[$d], "", 254) WinSetOnTop($ssGDI[Not ($d)], "", 0) WinSetTrans($ssGDI[Not ($d)], "", 0) _GDIPlus_GraphicsClear($ssGraphic[Not ($d)]) $c = 1 - $d _GDIPlus_ImageDispose ($ssImage) ; very important to realease the pics Sleep($sleep) EndFunc ;==>screenshotWidgetTransition Func screenshotWidgetInit($ssW,$ssH,$ssX,$ssY) $ssGDI[2] = GUICreate("", $ssW, $ssH, $ssX, $ssY, $WS_POPUP, $WS_EX_MDICHILD, $mainWindow) $ssGDI[0] = GUICreate("", $ssW, $ssH, 3, 3, $WS_POPUP, $WS_EX_MDICHILD, $ssGDI[2]) $ssGDI[1] = GUICreate("", $ssW, $ssH, 3, 3, $WS_POPUP, $WS_EX_MDICHILD, $ssGDI[2]) ; GUISetBkColor("0x" & $bg_color, $ssGDI[2]) GUISetState(@SW_SHOW, $ssGDI[2]) GUISetState(@SW_SHOW, $ssGDI[0]) GUISetState(@SW_SHOW, $ssGDI[1]) WinSetTrans($ssGDI[0], "", 0) WinSetTrans($ssGDI[1], "", 0) _GDIPlus_Startup() $ssGraphic[0] = _GDIPlus_GraphicsCreateFromHWND($ssGDI[0]) $ssGraphic[1] = _GDIPlus_GraphicsCreateFromHWND($ssGDI[1]) _GDIPlus_GraphicsClear($ssGraphic[0], "0xFF" & $bg_color) _GDIPlus_GraphicsClear($ssGraphic[1], "0xFF" & $bg_color) EndFunc ;==>screenshotWidgetInit Func _Exit() _GDIPlus_ImageDispose($ssImage) _GDIPlus_GraphicsDispose($ssGraphic[0]) _GDIPlus_GraphicsDispose($ssGraphic[1]) GUIDelete($ssGDI[0]) GUIDelete($ssGDI[1]) GUIDelete($ssGDI[2]) _GDIPlus_Shutdown() Exit EndFunc ;==>_Exit I hope someone can shed light on this; perhaps a different approach is needed?
      Thank you in advance!
      P.S.
      The script is patched from different scripts of different users in the forum - thank you again users!
    • Daka
      By Daka
      I know there are listbox and listview, but now I have?
      here is the video of infowindow 
      I tried to read mouse selection like for listbox:
      $listWindow = "[CLASS:TFormResearchGR]" $topicsList = "[CLASS:TMWrapper; INSTANCE:255]" WinWait($listWindow, "", 60) $hdlWindow = WinGetHandle($listWindow) $hdlList = ControlGetHandle($hdlWindow, "", $topicsList) _GUICtrlListBox_ClickItem($hdlList, 0, "left") $countOfList = _GUICtrlListBox_GetCount($hdlList) ConsoleWrite("Count of list: " & $countOfList & @LF) count of list is not working.
      I realiezed that there are difference between listbox and listview, but this is something different.
      and till now I never saw that you can go inside with infotool and also get instances.
       
      so Im confused how to get the list number and the names of selection?
    • AndyS19
      By AndyS19
      I have a listview with 3 columns and I want to set the 3rd column's color based on the item's 'Param' value, but even though I set up for the 3rd column, the entire row always gets the color.
      My test code is below, but here is the pertinent code:
      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 $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $iDrawStage, $tCustDraw $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam) $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage') Switch $iDrawStage Case BitOR(0, $CDDS_ITEMPREPAINT) ;, $CDDS_SUBITEM) setItemColor($tCustDraw, $hWndFrom) Return $CDRF_NOTIFYSUBITEMDRAW EndSwitch EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func setItemColor($tCustDraw, $hWnd) Local $iIndex, $color, $iSubitem $iIndex = DllStructGetData($tCustDraw, 'dwItemSpec') ; item number $color = _GUICtrlListView_GetItemParam($hWnd, $iIndex) $iSubitem = DllStructGetData($tCustDraw, 'iSubItem') ; Here, I want to only change the color of the 3rd col, and not the 1st and 2nd cols DllStructSetData($tCustDraw, 'iSubItem', 2) ; always use the 3rd column (the 'sample' col) logmsg("+++: setItemColor($tCustDraw, 0x" & Hex($hWnd) & ") entered ... " _ & ", $iIndex = " & $iIndex & ", $iSubItem = " & $iSubitem & ", $color = " & Hex($color)) DllStructSetData($tCustDraw, 'clrText', $color) ; set the Text color DllStructSetData($tCustDraw, 'clrTextBk', bitnot($color)) ; set the background color EndFunc ;==>setItemColor Func logmsg($msg, $lnum = @ScriptLineNumber) ConsoleWrite("+++:" & $lnum & ": " & $msg & @CRLF) EndFunc ;==>logmsg
      Here is the full test code:
      #include-once ;#cs #NoTrayIcon #AutoIt3Wrapper_UseUpx=n #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 #AutoIt3Wrapper_UseX64=N Opt("GUICloseOnESC", 1) ; ESC closes GUI? (0 = no, 1 = yes) Opt("GUIOnEventMode", 1) ; Change to OnEvent mode Opt('MustDeclareVars', 1) OnAutoItExitRegister("_test_exit") Opt("GUIEventOptions", 1) ;0=default, 1=just notification, 2=GuiCtrlRead tab index Opt("WinTitleMatchMode", -2) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase #include <GuiListBox.au3> #include <ListViewConstants.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <ColorConstants.au3> Global $__MCP_obj, $__MCP_GUI_hWnd, $idListView, $hListView Global $hMainWin test() Exit Func test() $hMainWin = GUICreate("Test window", 120, 100, @DesktopWidth / 2, -1) GUICtrlCreateButton("Hwnd", 10, 10, 40, 20) GUICtrlSetOnEvent(-1, "handle_1stTEST_btn") GUICtrlCreateButton("ID", 50, 10, 40, 20) GUICtrlSetOnEvent(-1, "handle_2ndTEST_btn") GUISetOnEvent($GUI_EVENT_CLOSE, "_test_exit") GUISetState(@SW_SHOW) While (1) Sleep(17) WEnd EndFunc ;==>test Func _myColorPicker($obj) logmsg("+++: $obj = 0x" & Hex($obj) & @CRLF) Local $flags = 0 Local $ww, $wh, $x, $y, $w, $h $__MCP_obj = $obj $ww = 350 $wh = 500 $x = 200 $y = 150 $__MCP_GUI_hWnd = GUICreate("myColorPicker", $ww, $wh, $x, $y, $flags) $x = 10 $y = 10 $w = 150 $h = 20 GUICtrlCreateButton("Set caller's color", $x, $y, $w, $h) GUICtrlSetOnEvent(-1, "__MCP_handle_SetColor_btn") $y += $h + 5 $w = $ww - 25 $h = $wh - 100 $idListView = GUICtrlCreateListView("", $x, $y, $w, $h, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT)) $hListView = GUICtrlGetHandle($idListView) $x = $ww / 2 - 50 $y = $wh - 60 $w = 100 $h = 25 GUICtrlCreateButton("Quit Popup", $x, $y, $w, $h) GUICtrlSetOnEvent(-1, "__MCP_handle_QUIT_btn") GUICtrlSetFont($idListView, 8.5, -1, -1, "courier new") _GUICtrlListView_AddColumn($idListView, "Name", 100) _GUICtrlListView_AddColumn($idListView, "Value", 100) _GUICtrlListView_AddColumn($idListView, "Sample", 100) _GUICtrlListView_SetColumnWidth($idListView, 0, 100) _GUICtrlListView_SetColumnWidth($idListView, 1, 80) logmsg("+++: $idListView = " & $idListView) logmsg("+++: $hListView = 0x" & Hex($hListView)) __MCP_populateListView($hListView) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState(@SW_SHOW, $__MCP_GUI_hWnd) EndFunc ;==>_myColorPicker 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 $hListView Switch $iCode Case $NM_CUSTOMDRAW Local $iDrawStage, $tCustDraw $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $ilParam) $iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage') Switch $iDrawStage Case BitOR(0, $CDDS_ITEMPREPAINT) ;, $CDDS_SUBITEM) setItemColor($tCustDraw, $hWndFrom) Return $CDRF_NOTIFYSUBITEMDRAW EndSwitch EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func setItemColor($tCustDraw, $hWnd) Local $iIndex, $color, $iSubitem $iIndex = DllStructGetData($tCustDraw, 'dwItemSpec') ; item number $color = _GUICtrlListView_GetItemParam($hWnd, $iIndex) $iSubitem = DllStructGetData($tCustDraw, 'iSubItem') ; Here, I want to only change the color of the 3rd col, and not the 1st and 2nd cols DllStructSetData($tCustDraw, 'iSubItem', 2) ; always use the 3rd column (the 'sample' col) logmsg("+++: setItemColor($tCustDraw, 0x" & Hex($hWnd) & ") entered ... " _ & ", $iIndex = " & $iIndex & ", $iSubItem = " & $iSubitem & ", $color = " & Hex($color)) DllStructSetData($tCustDraw, 'clrText', $color) ; set the Text color DllStructSetData($tCustDraw, 'clrTextBk', bitnot($color)) ; set the background color EndFunc ;==>setItemColor Func logmsg($msg, $lnum = @ScriptLineNumber) ConsoleWrite("+++:" & $lnum & ": " & $msg & @CRLF) EndFunc ;==>logmsg Func __MCP_exit() GUIDelete($__MCP_GUI_hWnd) EndFunc ;==>__MCP_exit Func __MCP_handle_SetColor_btn() If (IsHWnd($__MCP_obj)) Then GUISetBkColor($COLOR_BLUE, $__MCP_obj) Else GUICtrlSetBkColor($__MCP_obj, $COLOR_BLUE) EndIf EndFunc ;==>__MCP_handle_SetColor_btn Func __MCP_populateListView($hWnd) Local $text, $parts, $iIndex Local Static $aItems[] = [ _ "BLACK | " & $CLR_BLACK & "|" & "", _ "BLUE | " & $CLR_BLUE & "|" & "", _ "RED | " & $CLR_RED & "|" & "", _ "WHITE | " & $CLR_WHITE & "|" & "", _ "YELLOW | " & $CLR_YELLOW & "|" & "" _ ] _GUICtrlListView_BeginUpdate($hWnd) _GUICtrlListView_DeleteAllItems($hWnd) For $ndx = 0 To UBound($aItems) - 1 $text = $aItems[$ndx] $parts = StringSplit($text, "|", 2) $parts[0] = StringStripWS($parts[0], 3) $parts[2] = StringStripWS($parts[2], 3) $iIndex = _GUICtrlListView_AddItem($hWnd, $parts[0], -1, $parts[1]) _GUICtrlListView_AddSubItem($hWnd, $iIndex, Hex($parts[1]), 1) _GUICtrlListView_AddSubItem($hWnd, $iIndex, $parts[0], 2) Next _GUICtrlListView_EndUpdate($hWnd) EndFunc ;==>__MCP_populateListView Func __MCP_handle_QUIT_btn() GUIDelete($__MCP_GUI_hWnd) EndFunc ;==>__MCP_handle_QUIT_btn Func handle_1stTEST_btn() _myColorPicker($hMainWin) EndFunc ;==>handle_1stTEST_btn Func handle_2ndTEST_btn() _myColorPicker(@GUI_CtrlId) EndFunc ;==>handle_2ndTEST_btn Func _test_exit() Exit EndFunc ;==>_test_exit