Jump to content
Sign in to follow this  
UEZ

How a ListView acts as CTRL was pressed by default?

Recommended Posts

I want that the Listview acts as CTRL key was pressed by default to avoid any deletion when the listview was clicked.

Here an example code:

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

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 to 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
Next

$cButton = GUICtrlCreateButton("Reset", 10, 510, 80, 30)

GUISetState()
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemSelected($iLV, 0)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemSelected($iLV, 1)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemSelected($iLV, 2)
ControlFocus($hGUI, "", $iLV)

; Create array to hold selection state
Global $aSelected[_GUICtrlListView_GetItemCount($iLV)]

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $cButton
            ; Clear all selections
             _GUICtrlListView_SetItemSelected($iLV, -1, False)
             ; Clear selected array
            Global $aSelected[_GUICtrlListView_GetItemCount($iLV)]
    EndSwitch
WEnd

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

    #forceref $hWnd, $iMsg, $wParam

    ; Struct = $tagNMHDR and "int Item;int SubItem" from $tagNMLISTVIEW
    Local $tStruct = DllStructCreate("hwnd;uint_ptr;int_ptr;int;int", $lParam)
    If @error Then Return
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = HWnd($tNMHDR.hWndFrom)
    Local $iIDFrom = $tNMHDR.IDFrom
    Local $iCode = $tNMHDR.Code
    Local Static $iCount = 0
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
    Switch $iCode
        Case $LVN_ITEMCHANGED
            If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
                Switch $tInfo.NewState
                    Case 8192 ;item checked
                        _GUICtrlListView_SetItemSelected($iLV, $tInfo.Item, True)
                    Case 4096 ;item unchecked
                        _GUICtrlListView_SetItemSelected($iLV, $tInfo.Item, False)
                EndSwitch
            EndIf
        Case $NM_CLICK
           $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
;~          _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _
;~                  "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _
;~                  "-->Code:" & @TAB & $iCode & @CRLF & _
;~                  "-->Index:" & @TAB & $tInfo.Index & @CRLF & _
;~                  "-->SubItem:" & @TAB & $tInfo.SubItem & @CRLF & _
;~                  "-->NewState:" & @TAB & $tInfo.NewState & @CRLF & _
;~                  "-->OldState:" & @TAB & $tInfo.OldState & @CRLF & _
;~                  "-->Changed:" & @TAB & $tInfo.Changed & @CRLF & _
;~                  "-->ActionX:" & @TAB & $tInfo.ActionX & @CRLF & _
;~                  "-->ActionY:" & @TAB & $tInfo.ActionY & @CRLF & _
;~                  "-->lParam:" & @TAB & $tInfo.lParam & @CRLF & _
;~                  "-->KeyFlags:" & @TAB & $tInfo.KeyFlags)
            _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, _GUICtrlListView_GetItemState($iLV, $tInfo.Index, $LVIS_SELECTED))
    EndSwitch
    Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
EndFunc

Func _DebugPrint($s_Text , $sLine = @ScriptLineNumber)
    ConsoleWrite( _
            "!===========================================================" & @CRLF & _
            "+======================================================" & @CRLF & _
            "-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $s_Text  & @CRLF & _
            "+======================================================" & @CRLF)
EndFunc   ;==>_DebugPrint

Just cklick the listview and you will see that the selection is deleted. Repeat it and hold the CTRL key pressed.

Any ideas?

I don't want to read the listview and check whether the checkbox is checked and mark the row appropriately! It's lagging...

 

Thanks,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

UEZ, May be you can use something like this:

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

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 to 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
Next
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemParam($iLV, 0, True)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemParam($iLV, 1, True)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemParam($iLV, 2, True)
ControlFocus($hGUI, "", $iLV)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState()

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  #forceref $hWnd, $iMsg, $wParam
  Local $tNMHDR, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $iCode = $tNMHDR.Code

  Switch $iCode
    Case $LVN_ITEMCHANGED
      Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
      If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
        Switch $tInfo.NewState
          Case 8192 ;item checked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, True)
          Case 4096 ;item unchecked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, False)
        EndSwitch
      EndIf

    Case $NM_CLICK
      Local $aInfo = GUIGetCursorInfo()
      Local $aTest = _GUICtrlListView_SubItemHitTest( $iLV, $aInfo[0], $aInfo[1] )
      If Not ( Not $aTest[4] And $aTest[6] ) Then
        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        Local $fChecked = Not _GUICtrlListView_GetItemParam($iLV, $tInfo.Index)
        _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, $fChecked)
        _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, $fChecked)
      EndIf

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

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

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

        Case $CDDS_ITEMPREPAINT                         ; Before painting an item
          Return $CDRF_NOTIFYSUBITEMDRAW                ; Notify the parent window of any SUBITEM-related drawing operations

        Case BitOR( $CDDS_ITEMPREPAINT, $CDDS_SUBITEM ) ; Before painting a subitem
          Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam ; Item param
          Local $iSubItem    = $tNMLVCUSTOMDRAW.iSubItem    ; Subitem index
          Local $uItemState  = $tNMLVCUSTOMDRAW.uItemState  ; Item state
          If $lItemlParam Then ; Checked rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
              DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600 ) ; Backcolor dark blue, BGR
            EndIf
          Else ; Other rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
            EndIf
          EndIf
          Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc
Checked state (and selection) in ItemParam.

Share this post


Link to post
Share on other sites

LarsJ,

interesting idea to simulate the CTRL key behavior which didn't came to my mind although I used  $NM_CUSTOMDRAW to draw the grid in different color.  :thumbsup:

Just for my curiosity: is there a way without simulating? How is windows handling the lv when ctrl is pressed?

Thanks!

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

LarsJ,

Another nice script. :thumbsup:

But could I make 2 suggested changes?

- 1. When adding extended styles to a ListView it is always advisable to use _GUICtrlListView_SetExtendedListViewStyle as some of these values are also used by $WS_Ex_* styles and can be confused with them. That is why the function exists. ;)

- 2. In ListViews created with the native function, AutoIt uses the item parameter to store the internal ControlID of the row. As explained in the Help file, it is best to use parameter values well above any possible existing ControlIDs (we recommend 1000+) as experience has shown that there can be "ghost" effects on the real control if this is not done. In this case you are only using True/False (1/0) and so there is no real possibility of this happening, but I raise it a useful hint for anyone reading. :)

Making those changes does not affect the script as you can see here (I use 1000/1001 as checked/unchecked):

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

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS)
_GUICtrlListView_SetExtendedListViewStyle($iLV, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))

_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 To 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_SetItemParam($iLV, $i, 1000)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
Next
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemParam($iLV, 0, 1001)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemParam($iLV, 1, 1001)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemParam($iLV, 2, 1001)
ControlFocus($hGUI, "", $iLV)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState()

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $tNMHDR, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $iCode = $tNMHDR.Code

    Switch $iCode
        Case $LVN_ITEMCHANGED
            Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
            If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
                Switch $tInfo.NewState
                    Case 8192 ;item checked
                        _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1001)
                    Case 4096 ;item unchecked
                        _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1000)
                EndSwitch
            EndIf

        Case $NM_CLICK
            Local $aInfo = GUIGetCursorInfo()
            Local $aTest = _GUICtrlListView_SubItemHitTest($iLV, $aInfo[0], $aInfo[1])
            If Not (Not $aTest[4] And $aTest[6]) Then
                $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                Local $iChecked = _GUICtrlListView_GetItemParam($iLV, $tInfo.Index)
                ConsoleWrite($iChecked & @CRLF)
                If $iChecked = 1000 Then
                    _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, 1001)
                    _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, True)
                Else
                    _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, 1000)
                    _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, False)
                EndIf

            EndIf

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

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

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

                Case $CDDS_ITEMPREPAINT ; Before painting an item
                    Return $CDRF_NOTIFYSUBITEMDRAW ; Notify the parent window of any SUBITEM-related drawing operations

                Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                    Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam ; Item param
                    Local $iSubItem = $tNMLVCUSTOMDRAW.iSubItem ; Subitem index
                    Local $uItemState = $tNMLVCUSTOMDRAW.uItemState ; Item state
                    If $lItemlParam = 1001 Then ; Checked rows
                        If Not BitAND($uItemState, $CDIS_FOCUS) Then
                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
                            DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
                        EndIf
                    Else ; Other rows
                        If Not BitAND($uItemState, $CDIS_FOCUS) Then
                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000)
                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF)
                        EndIf
                    EndIf
                    Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors

            EndSwitch

    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY
M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see 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

At first glance it looks like what I want BUT it doesn't work when you have checkboxes and mark checked and unmark unchecked rows in the list view.
Only rows with checked checkboxes should be selected using _GUICtrlListView_SetItemSelected().


Is it possible in this section

...
                            If $wParam = $iListView_Web Then
                                Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam ; Item param
                                Local $iSubItem = $tNMLVCUSTOMDRAW.iSubItem ; Subitem index
                                Local $uItemState = $tNMLVCUSTOMDRAW.uItemState ; Item state

                                If $lItemlParam Then ; Checked rows
                                    If Not BitAND($uItemState, $CDIS_FOCUS) Then
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", $iColor_Text) ; Forecolor white
                                        DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0x00FF00) ;0xFF9933) ; Backcolor blue, BGR
                                    EndIf
                                Else ; Other rows
                                    If Not BitAND($uItemState, $CDIS_FOCUS) Then
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", $iColor_Text)
                                        DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0x0000FF) ;$iColor_LV)
                                    EndIf
                                EndIf
                            EndIf
...

to set the background color only for checked rows?


Edit: seems that $CDIS_CHECKED, $CDIS_SELECTED, $CDIS_MARKED are doing partly the job. Continuing to test and search for a solution...


Btw, is there a way to get the color which the system uses to mark a row in LV? -> _WinAPI_GetSysColor($COLOR_HIGHLIGHT)


Forget it, it was my wrong implementation which caused the problems.


Br,
UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

One important thing. Because a row is drawn only in one color, the row should be drawn in the item part of the drawing stage, where the entire row is drawn at once. To draw such a row column by column in the subitem part is wrong, and leads to bad performance.

Here the rows are drawn in the item part of the drawing stage. The subitem part is deleted. A controlID offset with a value of 1000 is added to ItemParam.

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

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 to 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
    _GUICtrlListView_SetItemParam($iLV, $i, 1000)
Next
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemParam($iLV, 0, 1001)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemParam($iLV, 1, 1001)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemParam($iLV, 2, 1001)
ControlFocus($hGUI, "", $iLV)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState()

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  #forceref $hWnd, $iMsg, $wParam
  Local $tNMHDR, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $iCode = $tNMHDR.Code

  Switch $iCode
    Case $LVN_ITEMCHANGED
      Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
      If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
        Switch $tInfo.NewState
          Case 8192 ;item checked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1001)
          Case 4096 ;item unchecked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1000)
        EndSwitch
      EndIf

    Case $NM_CLICK
      Local $aInfo = GUIGetCursorInfo()
      Local $aTest = _GUICtrlListView_SubItemHitTest( $iLV, $aInfo[0], $aInfo[1] )
      If Not ( Not $aTest[4] And $aTest[6] ) Then
        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        Local $fChecked = Not ( _GUICtrlListView_GetItemParam($iLV, $tInfo.Index) = 1001 )
        _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, $fChecked + 1000)
        _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, $fChecked)
      EndIf

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

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

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

        Case $CDDS_ITEMPREPAINT                         ; Before painting an item
          Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam - 1000 ; Item param
          Local $uItemState  = $tNMLVCUSTOMDRAW.uItemState         ; Item state
          If $lItemlParam Then ; Checked rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
              DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600 ) ; Backcolor dark blue, BGR
            EndIf
          Else ; Other rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
            EndIf
          EndIf
          Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc

Share this post


Link to post
Share on other sites

Thanks LarsJ.
 
One question how would you implement multi selection? I mean if you change $NM_CLICK to $NM_DBLCLK and select some rows by holding down the shift key. These lines should be marked and the checkbox should be set.

The same when unselecting some lines.
 

This is what I did:

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


Global Const $iColor_TextBk = _WinAPI_GetSysColor($COLOR_HIGHLIGHT)
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS)
_GUICtrlListView_SetExtendedListViewStyle($iLV, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))

_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 To 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_SetItemParam($iLV, $i, 1000)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
Next
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemParam($iLV, 0, 1001)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemParam($iLV, 1, 1001)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemParam($iLV, 2, 1001)
ControlFocus($hGUI, "", $iLV)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState()

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $tNMHDR, $iCode, $aIndices, $n
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $iCode = $tNMHDR.Code

    Switch $iCode
        Case $LVN_ITEMCHANGED
            Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
            If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
                Switch $tInfo.NewState
                    Case 8192 ;item checked
                        _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1001)
                    Case 4096 ;item unchecked
                        _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1000)
                EndSwitch
            EndIf
        Case $NM_CLICK
            $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
            If $tInfo.KeyFlags = 4 Then
                Local $aIndices = _GUICtrlListView_GetSelectedIndices($iLV, True), $n
                For $n = 1 To $aIndices[0]
                    Switch Not _GUICtrlListView_GetItemChecked($iLV, $aIndices[$n])
                        Case False
                            _GUICtrlListView_SetItemParam($iLV, $aIndices[$n], 1000)
                            _GUICtrlListView_SetItemChecked($iLV, $aIndices[$n], False)
                        Case True
                            _GUICtrlListView_SetItemParam($iLV, $aIndices[$n], 1001)
                            _GUICtrlListView_SetItemChecked($iLV, $aIndices[$n], True)
                    EndSwitch
                Next
            EndIf
        Case $NM_DBLCLK
            Local $aInfo = GUIGetCursorInfo()
            Local $aTest = _GUICtrlListView_SubItemHitTest($iLV, $aInfo[0], $aInfo[1])
            If Not (Not $aTest[4] And $aTest[6]) Then
                $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                Local $iChecked = _GUICtrlListView_GetItemParam($iLV, $tInfo.Index)
                If $iChecked = 1000 Then
                    _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, 1001)
                    _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, True)
                Else
                    _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, 1000)
                    _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, False)
                EndIf
            EndIf
        Case $NM_CLICK
            $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
            If $tInfo.KeyFlags = 4 Then
                $aIndices = _GUICtrlListView_GetSelectedIndices($iLV, True)
                ConsoleWrite(UBound($aIndices) - 1 & @CRLF)
                For $n = 1 To $aIndices[0]
                    Switch Not _GUICtrlListView_GetItemChecked($iLV, $aIndices[$n])
                        Case False
                            _GUICtrlListView_SetItemParam($iLV, $aIndices[$n], 1000)
                            _GUICtrlListView_SetItemChecked($iLV, $aIndices[$n], False)
                        Case True
                            _GUICtrlListView_SetItemParam($iLV, $aIndices[$n], 1001)
                            _GUICtrlListView_SetItemChecked($iLV, $aIndices[$n], True)
                    EndSwitch
                Next
            EndIf
        Case $NM_CUSTOMDRAW
          Local $tNMLVCUSTOMDRAW = DllStructCreate( $tagNMLVCUSTOMDRAW, $lParam )
          Local $dwDrawStage = DllStructGetData( $tNMLVCUSTOMDRAW, "dwDrawStage" )

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

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

            Case $CDDS_ITEMPREPAINT                         ; Before painting an item
              Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam - 1000 ; Item param
              Local $uItemState  = $tNMLVCUSTOMDRAW.uItemState         ; Item state
              If $lItemlParam Then ; Checked rows
                If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
                  DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
                  DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", $iColor_TextBk ) ; Backcolor dark blue, BGR
                EndIf
              Else ; Other rows
                If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
                  DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
                  DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
                EndIf
              EndIf
              Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

          EndSwitch

    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Br,
UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

I would separate checked and selected rows to make things easier:

 

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

$hGUI = GUICreate("ListView Test", 400, 550)
$iLV = GUICtrlCreateListView("", 0, 10, 400, 480, $LVS_SHOWSELALWAYS, BitOR($LVS_EX_FLATSB, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($iLV, "Date", 100, 1)
_GUICtrlListView_AddColumn($iLV, "Size (bytes)", 100, 1)
_GUICtrlListView_AddColumn($iLV, "File Name", 100, 1)
For $i = 0 to 150
    _GUICtrlListView_AddItem($iLV, "Row " & $i)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 2, 1)
    _GUICtrlListView_AddSubItem($iLV, $i, $i * 4, 2)
    _GUICtrlListView_SetItemParam($iLV, $i, 1000)
Next
_GUICtrlListView_SetItemChecked($iLV, 0)
_GUICtrlListView_SetItemParam($iLV, 0, 1001)
_GUICtrlListView_SetItemChecked($iLV, 1)
_GUICtrlListView_SetItemParam($iLV, 1, 1001)
_GUICtrlListView_SetItemChecked($iLV, 2)
_GUICtrlListView_SetItemParam($iLV, 2, 1001)
ControlFocus($hGUI, "", $iLV)

GUICtrlCreateLabel( "Space to invert checked state of selected items", 10, 500, 380, 20 )
GUICtrlSetFont( -1, 10, 700 )

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

GUISetState()

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

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
  #forceref $hWnd, $iMsg, $wParam
  Local $tNMHDR, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $iCode = $tNMHDR.Code

  Switch $iCode
    Case $LVN_ITEMCHANGED
      Local $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
      If BitAND($tInfo.Changed, $LVIF_STATE) = $LVIF_STATE Then
        Switch $tInfo.NewState
          Case 8192 ;item checked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1001)
          Case 4096 ;item unchecked
            _GUICtrlListView_SetItemParam($iLV, $tInfo.Item, 1000)
        EndSwitch
      EndIf

    Case $LVN_KEYDOWN
      Local $tKey = DllStructCreate($tagNMLVKEYDOWN, $lParam)
      If $tKey.VKey = 0x20 Then ; $VK_SPACE = 0x20
        Local $aSelected = _GUICtrlListView_GetSelectedIndices($iLV, True)
        If $aSelected[0] > 1 Then ; $aSelected[0] = 1 is handled by default code
          For $i = 1 To $aSelected[0]
            If _GUICtrlListView_GetItemState($iLV, $aSelected[$i], $LVIS_FOCUSED ) Then ContinueLoop ; Handled by default code
            Local $fChecked = Not ( _GUICtrlListView_GetItemParam($iLV, $aSelected[$i]) = 1001 )
            _GUICtrlListView_SetItemParam($iLV, $aSelected[$i], $fChecked + 1000)
            _GUICtrlListView_SetItemChecked($iLV, $aSelected[$i], $fChecked)
            _GUICtrlListView_SetItemSelected($iLV, $aSelected[$i], False)
          Next
        EndIf
      EndIf

    Case $NM_DBLCLK
      Local $aInfo = GUIGetCursorInfo()
      Local $aTest = _GUICtrlListView_SubItemHitTest( $iLV, $aInfo[0], $aInfo[1] )
      If Not ( Not $aTest[4] And $aTest[6] ) Then
        $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
        Local $fChecked = Not ( _GUICtrlListView_GetItemParam($iLV, $tInfo.Index) = 1001 )
        _GUICtrlListView_SetItemParam($iLV, $tInfo.Index, $fChecked + 1000)
        _GUICtrlListView_SetItemChecked($iLV, $tInfo.Index, $fChecked)
      EndIf

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

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

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

        Case $CDDS_ITEMPREPAINT                         ; Before painting an item
          Local $lItemlParam = $tNMLVCUSTOMDRAW.lItemlParam - 1000 ; Item param
          Local $uItemState  = $tNMLVCUSTOMDRAW.uItemState         ; Item state
          If $lItemlParam Then ; Checked rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              ;DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
              ;DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600 ) ; Backcolor dark blue, BGR
              DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xFFFF00 ) ; Backcolor cyan, BGR
            EndIf
          Else ; Other rows
            If Not BitAnd( $uItemState, $CDIS_FOCUS ) Then
              ;DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
              ;DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
              DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
            EndIf
          EndIf
          Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc

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  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By DrJohn
      Hello all.  It's me again.
      I've got a ListView with an associated ImageList to display icons.  What I seem to be hung up on is how to keep the ImageList updated to match the ListView as the latter changes.  I thought it was the case that the indices of the items in the ListView and those in the ImageList just needed to match.  So, for example, if I:
      Delete an item from the ListView [_GUICtrlListView_DeleteItem()], and also delete the image at the matching index in the ImageList [_GUIImageList_Remove()]. Then add a new item to the end of the ListView [_GUICtrlListView_AddItem()], and correspondingly add an image at the end of the ImageList [_GUIImageList_AddIcon()] Shouldn't everything stay in sync?
      Here's the code I thought would work:
      #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <FontConstants.au3> #include <WindowsConstants.au3> #include <GuiImageList.au3> Test() func Test() $gui = GUICreate("Test", 400, 300) ; Create ListView $lv = _GUICtrlListView_Create($gui, "", 10, 10, 380, 240, $LVS_DEFAULT) _GUICtrlListView_AddColumn($lv, "Col1", 50) _GUICtrlListView_AddColumn($lv, "Col2", 50) for $i = 0 to 2 $s = StringFormat("%d,1", $i+1) _GUICtrlListView_AddItem($lv, $s, $i) $s = StringFormat("%d,2", $i+1) _GUICtrlListView_AddSubItem($lv, $i, $s, 1) next ; Add ImageList $img_list = _GUIImageList_Create(16, 16, 5, 3) for $i = 0 to 2 $ico = StringFormat("%d.ico", $i+1) _GUIImageList_AddIcon($img_list, $ico) next _GUICtrlListView_SetImageList($lv, $img_list, 1) ; $btn = GUICtrlCreateButton("Test", 10, 260, 60, 30) GUISetState(@SW_SHOW) HotKeySet("^q", Quit) ; Loop until the user exits. while True switch GUIGetMsg() case $GUI_EVENT_CLOSE Exit case $btn ; Remove 2nd list item and image _GUICtrlListView_DeleteItem($lv, 1) _GUIImageList_Remove($img_list, 1) ; Add new item to end of ListView $idx = _GUICtrlListView_AddItem($lv, "foo") _GUICtrlListView_AddSubItem($lv, $idx, "bar", 1) ; Add new image to end of ImageList _GUIImageList_AddIcon($img_list, "5.ico") endswitch wend GUIDelete() endfunc func Quit() Exit endfunc What seems to happen is that when the new item is added to the ListView, its icon is 1.ico (the first item in the ImageList), rather than 5.ico (the newly added item that should be at the end of the ImageList).
      Or do I need to re-create the whole ImageList any time the ListView changes?
      A zip file is attached that contains the script and also the .ico files, for easier testing.
      Thanks!
      /John
      test.zip
    • By UEZ
      This project has been discontinued!
       
      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.5 build 2020-07-04 beta.7z  (1509 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
    • By Dan_555
      Hi.
      I'm using the FreeCommander XE file manager here, and i'v written a script, which will create an empty, new file, after choosing an extension out from the Listbox.
       
      The listview code  is not mine, iv found the scripts somewhere on this forum. I have no credits in it, because it was intended to be only for my personal use.
      But now, i have a lot of free time, so i remembered that i haven't posted anything on this forum, yet, so here is my first script:
      It should be compiled with the Autoit v3.3.14.3 .
      The compiled exe needs a folder passed as a parameter, so that it know where to create the new file.
      A Listbox is opened, with a selection of available extensions.
      After selecting and doubleclicking (or using the ok button), the script creates a filename (if specified in the config file) with increased numbers (up to 9999).
      If the filename exist, the counter is checking the next number, until the maximum is reached.
      This script uses an ini file for configuration, called "NewFile.ini" which should be in the same folder, as the compiled exe.
      NewFile.au3
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiListView.au3> #include <String.au3> #include <WinAPIFiles.au3> #include <Array.au3> #include <EditConstants.au3> #include <GuiEdit.au3> #include <ScrollBarsConstants.au3> Global $test[0][2], $hFile, $cmd = "", $cmdtmp, $tmptxt, $tmpinidir, $filesetting, $MouseX, $MouseY, $UseMouseX, $UseMouseY, $Edit1 Global $aArray[1] = [] $cmdtmp = StringReplace($cmdlineraw, Chr(34), "") If StringLen($cmdtmp) = 2 Then     If StringRight($cmdtmp, 1) = ":" Then         $cmd = $cmdtmp & "\"     EndIf Else     If StringRight($cmdtmp, 1) <> "\" Or StringRight($cmdtmp, 1) <> "/" Then         $cmd = $cmdtmp & "\"     EndIf EndIf If Not FileExists($cmd) Then                    ;Check if the folder exists, display an error message if not !     DisplayReadMe(1)     Exit EndIf If StringLen(@ScriptDir) > 3 And StringRight(@ScriptDir, 1) <> "\" Then     $tmpinidir = @ScriptDir & "\" Else     $tmpinidir = @ScriptDir EndIf Local Const $sFilePath = $tmpinidir & "NewFile.ini" $filesetting = IniRead($sFilePath, "setting", "filename", "MyNewFile") $filesetting = StringReplace($filesetting, ">", " ") ;msgbox (0,"",$filesetting)  ;Debugging If FileExists($sFilePath) Then     $aArray = IniReadSectionNames($sFilePath) ; Read the INI section names. This will return a 1 dimensional array. EndIf $UseMouseX = IniRead($sFilePath, "setting", "UseMouseX", "1") $UseMouseY = IniRead($sFilePath, "setting", "UseMouseY", "0") ; Check if an error occurred. If Not @error Then     ; Enumerate through the array displaying the section names.     Local $count = 0     If FileExists($sFilePath) Then         For $i = 1 To $aArray[0]             $tmp1 = IniRead($sFilePath, $aArray[$i], "1", "none")             If $tmp1 <> "none" And StringLeft($tmp1, 1) = "." Then            ;Extension need to have a dot, or it will be ignored !                 $tmptxt = $tmptxt & $tmp1 & "|" & $aArray[$i] & @CRLF                 $count = $count + 1                                            ;Count how many extensions are added !             EndIf         Next     EndIf     If $count = 0 Then $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text File" & @CRLF     ;MsgBox($MB_SYSTEMMODAL,"",$tmptxt)     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) Else                                                            ;Reading the ini failed, create a default array for the extensions     $tmptxt = ".au3|AutoIt 3" & @CRLF & ".txt|Text" & @CRLF     _ArrayAdd($test, $tmptxt, 0, "|", @CRLF) EndIf ;Local $test[5][2] = [['.au3', 'AutoIt'], ['.ahk', 'Auto Hotkey'], ['.txt', 'text'], ['.sdlbas', 'Sdl Basic'], ['.html', 'Webpage']] If $UseMouseX = 1 Then     $MouseX = MouseGetPos(0) Else     $MouseX = -1 EndIf If $UseMouseY = 1 Then     $MouseY = MouseGetPos(1) Else     $MouseY = -1 EndIf $Form1 = GUICreate("Create New File", 210, 247, $MouseX, $MouseY, $WS_CAPTION, $WS_EX_TOOLWINDOW) $List = GUICtrlCreateListView("", 5, 5, 200, 200) _GUICtrlListView_InsertColumn($List, 0, "Extension", 65) _GUICtrlListView_InsertColumn($List, 1, "Description", 115) _GUICtrlListView_AddArray($List, $test) GUICtrlCreateLabel("Example:" & $filesetting & "0000.ext", 5, 205) $Button1 = GUICtrlCreateButton("Ok", 16, 224, 45, 22) $Button3 = GUICtrlCreateButton("ReadMe", 80, 224, 55, 22) $Button2 = GUICtrlCreateButton("Cancel", 150, 224, 45, 22) $cDummy = GUICtrlCreateDummy() GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE, $Button2             Exit         Case $Button3             DisplayReadMe(0)         Case $Button1, $cDummy             Local $tmptxt = StringSplit(_GUICtrlListView_GetItemTextString($List), "|")[1]             If StringLen($tmptxt) > 0 Then                 Local $fnr = 0, $tmpfile = ""                 While $fnr < 10000                     $tmpfile = $cmd & $filesetting & _StringRepeat("0", 4 - StringLen($fnr)) & $fnr & $tmptxt                     ;MsgBox(0,"",$tmpfile) ; for debugging                     If Not (FileExists($tmpfile)) Then                         $hFile = _WinAPI_CreateFile($tmpfile, 0)                         _WinAPI_CloseHandle($hFile)                         Exit                     EndIf                     $fnr = $fnr + 1                 WEnd             EndIf     EndSwitch WEnd ;================================================================================ Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView     $hWndListView = $List     If Not IsHWnd($List) Then $hWndListView = GUICtrlGetHandle($List)     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))     $iCode = DllStructGetData($tNMHDR, "Code")     Switch $hWndFrom         Case $hWndListView             Switch $iCode                 Case $NM_DBLCLK                     ; Fire the dummy if the ListView is double clicked                     GUICtrlSendToDummy($cDummy)             EndSwitch     EndSwitch     Return $GUI_RUNDEFMSG EndFunc   ;==>WM_NOTIFY Func DisplayReadMe($err)     Local $Form1 = GUICreate("Read Me", 550, 400, 10, 10, BitOR($WS_CAPTION, $WS_THICKFRAME ,$WS_MAXIMIZEBOX))     $Edit1 = GUICtrlCreateEdit("", 0, 0, 549, 399)     GUICtrlSetData(-1, "")     GUISetState(@SW_SHOW)     If $err=1 then         local $txttmp01="Error: Path does not exist"         local $txttmp02="Commandline call was: "         AddText ($txttmp01)         Addtext ($txttmp02 & $cmd & @CRLF & @CRLF)     EndIf     AddText("Instructions:" & @CRLF)     AddText("Displays a selection of available extensions and then creates a new file at the Path's location." & @CRLF & @CRLF & "Usage: NewFile Path")     AddText("Example: NewFile c:\myfolder\" & @CRLF)     AddText("Result: A file with a name 'MyFile0000.ext' will be created at the Path's location.")     AddText("If the filename exists, the number counter will increase, until it finds a free number, up to 9999." & @CRLF)     AddText("Uses a configuration file in the .exe folder named NewFile.ini !" & @CRLF)     AddText("Example of a config file:" & @CRLF)     AddText("[setting]" & @CRLF & "filename=MyFile>")     AddText("UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings !")     AddText("UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates !" & @CRLF)     AddText(";Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number)" & @CRLF)     AddText(";Format for this ini file is:" & @CRLF & ";Name              e.g [Auto It]")     AddText(";extension       e.g 1=.au3" & @CRLF & "; p.s. only 1 extension per section ! the number must be 1" & @CRLF)     AddText("[AutoIt3]" & @CRLF & "1=.au3" & @CRLF & @CRLF & "[Text]" & @CRLF & "1=.txt")     _GUICtrlEdit_SetSel($Edit1, 0, 0)     _GUICtrlEdit_Scroll($Edit1, $SB_SCROLLCARET)     If $err=1 Then         _GUICtrlEdit_SetSel($Edit1, 0, StringLen($txttmp01 & $txttmp02 & $cmd)+5)     EndIf     While 1         $nMsg = GUIGetMsg()         Switch $nMsg             Case $GUI_EVENT_CLOSE                 GUIDelete($Form1)                 ExitLoop         EndSwitch     WEnd EndFunc   ;==>DisplayReadMe Func AddText($edittxt)     _GUICtrlEdit_AppendText($Edit1, $edittxt & @CRLF) EndFunc   ;==>AddText  
       NewFile.ini
      [setting] filename=MyNewFile_ UseMouseX=0                ;0 or 1 - position the dialog at the mouse x coordinate - usefull for multi monitor settings ! UseMouseY=0                ;0 or 1 - Set this and UseMouseX to spawn the dialog at the mouse coordinates ! ;Use > in filename as a space char ! (only needed if you want the space char at the beginning or at the end : in between filename and the number) ;Format for this ini file is: ;Name              e.g [Auto It] ;extension       e.g 1=.au3 ; p.s. only 1 extension per section ! the number must be 1 [AutoIt3] 1=.au3 [Auto Hotkey] 1=.ahk [Text] 1=.txt [Sdl Basic] 1=.sdlbas [Webpage] 1=.html [Basic] 1=.bas [Pascal] 1=.pas [Rich Text (RTF)] 1=.rtf [Word Document] 1=.doc [Hex File] 1=.hex
    • By Miliardsto
      I have the following code. You can see there are $color_normal and $color_trans
      In my case normal is too dark . And color trans is to much violet.
      If you run it you will see how its looks. I want gui with listView have the same color like taskbar in windows 10.
      How to achieve that?
       
       
      #include <Date.au3> #include <MsgBoxConstants.au3> #include <GuiListBox.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> HotKeySet("{ESC}", "Terminate") $color_normal = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) $color_trans = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) $trans = RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") ConsoleWrite("Transpart = " & $trans & @CRLF) ConsoleWrite("Color normal = " & $color_normal & @CRLF) ConsoleWrite("Color trans = " & $color_trans & @CRLF) ConsoleWrite(_Get_taskbar_color()); It return AARRGGBB $taskbarColor = _Get_taskbar_color() Global $gui = GUICreate("Test", 150, 58,@DesktopWidth-300,@DesktopHeight-58,$WS_POPUP,BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) Global $idListview = GUICtrlCreateListView("", 0, 0, 150, 58,BitOR($LBS_NOTIFY,$LBS_SORT), 0) ;_GuiCtrlMakeTrans(-1,100) ; Add column _GUICtrlListView_AddColumn($idListview, "Msgs", 100) GUICtrlSetFont(-1, 7, 400, 0, "Segoe UI") GUICtrlSetColor(-1, 0x470C4F) GUICtrlSetBkColor($idListview, 0x310638) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func Terminate() Exit EndFunc Func _Get_taskbar_color() If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "ColorPrevalence") Then If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) Else Return "0xFF" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) EndIf Else If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9000000" Else Return "0xFF000000" EndIf EndIf EndFunc  
    • By Slipk
      Hello everybody,
      #include <GUIConstantsEx.au3> #include <ListViewConstants.au3> #include <WindowsConstants.au3> #include <GUIListViewEx.au3> $Form1 = GUICreate("Form1", 539, 350, 192, 124) $ListView1 = GUICtrlCreateListView("CLM1|CLM2", 0, 0, 538, 326) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150) GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150) Local $dynamic = GUICtrlCreateListViewItem("Example1|Example2", $ListView1) $SubMenu = GUICtrlCreateContextMenu($dynamic) $Run = GUICtrlCreateMenuItem("Run", $SubMenu) $Edit = GUICtrlCreateMenuItem("Edit", $SubMenu) $Delete = GUICtrlCreateMenuItem("Delete", $SubMenu) Local $dynamic2 = GUICtrlCreateListViewItem("Example3|Example6", $ListView1) $SubMenu = GUICtrlCreateContextMenu($dynamic2) $Run = GUICtrlCreateMenuItem("Run", $SubMenu) $Edit = GUICtrlCreateMenuItem("Edit", $SubMenu) $Delete = GUICtrlCreateMenuItem("Delete", $SubMenu) _GUIListViewEx_Init($ListView1, "", 0, 0, True, 64) _GUIListViewEx_MsgRegister() GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd I use GUIListViewEx.au3 for position of items in listview but when I move one the context menu disappear. Any solution of this?
      Any method than array it is possible?
      Thank you, appreciate it.
       
       
×
×
  • Create New...