Jump to content

ListView marked cells selection via keys


UEZ
 Share

Go to solution Solved by UEZ,

Recommended Posts

Any idea how to change this example from LarsJ so that the selection via arrow keys works for marked cells?

;coded by LarsJ
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>

Opt( "MustDeclareVars", 1 )

Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [ -1, -1 ]  ; $aHit contains row & col of marked cell
Global $aLV = [ [ 0,  25,  45, -1, -1 ], _ ; $hLV, $iLVx, $iLVy, $aHit[0], $aHit[1]
                [ 0, 125, 145, -1, -1 ], _
                [ 0, 225, 245, -1, -1 ] ]

Example()


Func Example()

  $hGui = GUICreate( "Mark Cell in Listview", 500, 520 )

  Local $idTab = GUICtrlCreateTab( 10, 10, 480, 500 )

  GUICtrlCreateTabItem( "Tab 0, LV 0" )
  Local $idLV0 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 25, 45, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0 )
  Next
  $hLV = GUICtrlGetHandle( $idLV0 )
  $aLV[0][0] = $hLV
  $iLVx = 25
  $iLVy = 45

  GUICtrlCreateTabItem( "Tab 1, LV 1" )
  Local $idLV1 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 125, 145, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV1 )
  Next
  $aLV[1][0] = GUICtrlGetHandle( $idLV1 )

  GUICtrlCreateTabItem( "Tab 2, LV 2" )
  Local $idLV2 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 225, 245, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV2 )
  Next
  $aLV[2][0] = GUICtrlGetHandle( $idLV2 )

  GUICtrlCreateTabItem( "" )

  GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )

  GUISetState()

  Local $iTab, $iTabPrev = 0
  While 1
    Switch GUIGetMsg()
      Case $idTab
        $iTab = GUICtrlRead( $idTab )
        $aLV[$iTabPrev][3] = $aHit[0]
        $aLV[$iTabPrev][4] = $aHit[1]
        $hLV = $aLV[$iTab][0]
        $iLVx = $aLV[$iTab][1]
        $iLVy = $aLV[$iTab][2]
        $aHit[0] = $aLV[$iTab][3]
        $aHit[1] = $aLV[$iTab][4]
        If $aHit[0] <> -1 Then _
          _GUICtrlListView_RedrawItems( $hLV, $aHit[0], $aHit[0] )
        $iTabPrev = $iTab
      Case $GUI_EVENT_CLOSE
        Exit
    EndSwitch
  WEnd

EndFunc

Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
  Local $tNMHDR, $hWndFrom, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
  $iCode = DllStructGetData( $tNMHDR, "Code" )

  Switch $hWndFrom

    Case $hLV

      Switch $iCode

        Case $LVN_ITEMCHANGED
          Local $tNMLISTVIEW, $iItem, $aInfo
          $tNMLISTVIEW = DllStructCreate( $tagNMLISTVIEW, $lParam )
          $iItem = DllStructGetData( $tNMLISTVIEW, "Item" )
          _GUICtrlListView_SetItemSelected( $hLV, $iItem, False )
          _GUICtrlListView_SetItemState( $hLV, $iItem, 0, $LVIS_FOCUSED )

          Local $aInfo = GUIGetCursorInfo( $hGui )
          If $aInfo[2] Then
            $aInfo = _GUICtrlListView_SubItemHitTest( $hLV, $aInfo[0]-$iLVx, $aInfo[1]-$iLVy )
            If $aInfo[0] > -1 And $aInfo[1] > -1 And $aInfo[0] = $iItem Then
              If $aHit[0] > -1 Then _
                _GUICtrlListView_RedrawItems( $hLV, $aHit[0], $aHit[0] )
              If $aHit[0] <> $aInfo[0] Or $aHit[1] <> $aInfo[1] Then
                $aHit[0] = $aInfo[0] ; Row
                $aHit[1] = $aInfo[1] ; Col
              Else
                $aHit[0] = -1 ; Row
                $aHit[1] = -1 ; Col
              EndIf
              _GUICtrlListView_RedrawItems( $hLV, $iItem, $iItem )
            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 $dwItemSpec = DllStructGetData( $tNMLVCUSTOMDRAW, "dwItemSpec" ) ; Item index
              Local $iSubItem   = DllStructGetData( $tNMLVCUSTOMDRAW, "iSubItem"   ) ; Subitem index
              Local $uItemState = DllStructGetData( $tNMLVCUSTOMDRAW, "uItemState" ) ; Item state
              If $dwItemSpec = $aHit[0] Then ; Marked row
                Switch $iSubItem
                  Case $aHit[1] ; Marked column
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
                    DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600 ) ; Backcolor dark blue, BGR
                  Case Else ; Other columns
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 ) ; Forecolor black
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF ) ; Backcolor white
                EndSwitch
              Else ; Other rows
                DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
                DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
              EndIf
              Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

          EndSwitch

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • UEZ changed the title to ListView marked cells selection via keys
10 minutes ago, LarsJ said:

Identify keys with lvn_keydown or similar

I did tons of variations but always 

Case $LVN_ITEMCHANGED

blocks the key input.

;coded by LarsJ
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>

Opt( "MustDeclareVars", 1 )

Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [ -1, -1 ]  ; $aHit contains row & col of marked cell
Global $aLV = [ [ 0,  25,  45, -1, -1 ], _ ; $hLV, $iLVx, $iLVy, $aHit[0], $aHit[1]
                [ 0, 125, 145, -1, -1 ], _
                [ 0, 225, 245, -1, -1 ] ]

Example()


Func Example()

  $hGui = GUICreate( "Mark Cell in Listview", 500, 520 )

  Local $idTab = GUICtrlCreateTab( 10, 10, 480, 500 )

  GUICtrlCreateTabItem( "Tab 0, LV 0" )
  Local $idLV0 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 25, 45, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0 )
  Next
  $hLV = GUICtrlGetHandle( $idLV0 )
  $aLV[0][0] = $hLV
  $iLVx = 25
  $iLVy = 45

  GUICtrlCreateTabItem( "Tab 1, LV 1" )
  Local $idLV1 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 125, 145, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV1 )
  Next
  $aLV[1][0] = GUICtrlGetHandle( $idLV1 )

  GUICtrlCreateTabItem( "Tab 2, LV 2" )
  Local $idLV2 = GUICtrlCreateListView( "Column 0|Column 1|Column 2", 225, 245, 250, 250 )
  For $i = 0 To 99
    GUICtrlCreateListViewItem( "Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV2 )
  Next
  $aLV[2][0] = GUICtrlGetHandle( $idLV2 )

  GUICtrlCreateTabItem( "" )

  GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )

  GUISetState()

  Local $iTab, $iTabPrev = 0
  While 1
    Switch GUIGetMsg()
      Case $idTab
        $iTab = GUICtrlRead( $idTab )
        $aLV[$iTabPrev][3] = $aHit[0]
        $aLV[$iTabPrev][4] = $aHit[1]
        $hLV = $aLV[$iTab][0]
        $iLVx = $aLV[$iTab][1]
        $iLVy = $aLV[$iTab][2]
        $aHit[0] = $aLV[$iTab][3]
        $aHit[1] = $aLV[$iTab][4]
        If $aHit[0] <> -1 Then _
          _GUICtrlListView_RedrawItems( $hLV, $aHit[0], $aHit[0] )
        $iTabPrev = $iTab
      Case $GUI_EVENT_CLOSE
        Exit
    EndSwitch
  WEnd

EndFunc

Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
  Local $tNMHDR, $hWndFrom, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
  $iCode = DllStructGetData( $tNMHDR, "Code" )

  Switch $hWndFrom

    Case $hLV
        Local $iSelectedItem = _GUICtrlListView_GetSelectionMark($hLV)
        ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hLV) & @CRLF)
      Switch $iCode
        ; Handle arrow key presses for selection movement

          Case $LVN_KEYDOWN
            Local $tNMLVKEYDOWN = DllStructCreate($tagNMLVKEYDOWN, $lParam)
            Local $iVKey = DllStructGetData($tNMLVKEYDOWN, "VKey")


            If $iSelectedItem > -1 Then
                Local $iNewIndex = -1
                If $iVKey = 38 Then ; Up arrow key
                    $iNewIndex = $iSelectedItem - 1
                ElseIf $iVKey = 40 Then ; Down arrow key
                    $iNewIndex = $iSelectedItem + 1
                EndIf
                ConsoleWrite($iNewIndex & @CRLF)
                If $iNewIndex > -1 And $iNewIndex < _GUICtrlListView_GetItemCount($hLV) Then
                    _GUICtrlListView_SetItemSelected($hLV, $iNewIndex, True, False)
                    _GUICtrlListView_RedrawItems( $hLV, $iNewIndex, $iNewIndex )
                EndIf
            EndIf

        Case $LVN_ITEMCHANGED
          Local $tNMLISTVIEW, $iItem, $aInfo
          $tNMLISTVIEW = DllStructCreate( $tagNMLISTVIEW, $lParam )
          $iItem = DllStructGetData( $tNMLISTVIEW, "Item" )
          _GUICtrlListView_SetItemSelected( $hLV, $iItem, False )
          _GUICtrlListView_SetItemState( $hLV, $iItem, 0, $LVIS_FOCUSED )

          Local $aInfo = GUIGetCursorInfo( $hGui )
          If $aInfo[2] Then
            $aInfo = _GUICtrlListView_SubItemHitTest( $hLV, $aInfo[0]-$iLVx, $aInfo[1]-$iLVy )
            If $aInfo[0] > -1 And $aInfo[1] > -1 And $aInfo[0] = $iItem Then
              If $aHit[0] > -1 Then _GUICtrlListView_RedrawItems( $hLV, $aHit[0], $aHit[0] )
              If $aHit[0] <> $aInfo[0] Or $aHit[1] <> $aInfo[1] Then
                $aHit[0] = $aInfo[0] ; Row
                $aHit[1] = $aInfo[1] ; Col
              Else
                $aHit[0] = -1 ; Row
                $aHit[1] = -1 ; Col
              EndIf
              _GUICtrlListView_RedrawItems( $hLV, $iItem, $iItem )
            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 $dwItemSpec = DllStructGetData( $tNMLVCUSTOMDRAW, "dwItemSpec" ) ; Item index
              Local $iSubItem   = DllStructGetData( $tNMLVCUSTOMDRAW, "iSubItem"   ) ; Subitem index
              Local $uItemState = DllStructGetData( $tNMLVCUSTOMDRAW, "uItemState" ) ; Item state
              If $dwItemSpec = $aHit[0] Then ; Marked row
                Switch $iSubItem
                  Case $aHit[1] ; Marked column
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0xFFFFFF ) ; Forecolor white
                    DllStructSetData( $tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600 ) ; Backcolor dark blue, BGR
                  Case Else ; Other columns
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 ) ; Forecolor black
                    DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF ) ; Backcolor white
                EndSwitch
              Else ; Other rows
                DllStructSetData( $tNMLVCUSTOMDRAW, "ClrText",   0x000000 )
                DllStructSetData( $tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF )
              EndIf
              Return $CDRF_NEWFONT                          ; $CDRF_NEWFONT must be returned after changing font or colors

          EndSwitch

      EndSwitch

  EndSwitch

  Return $GUI_RUNDEFMSG
EndFunc

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

You might use a hook procedure to identify the key instead.Or test if you can still handle lvn_keydown inside LVN ITEMCHANGED.

Edited by LarsJ
Link to comment
Share on other sites

LVN_ITEMCHANGED
LVN_ITEMCHANGED
LVN_KEYDOWN
LVN_ITEMCHANGED
LVN_KEYDOWN
LVN_KEYDOWN
LVN_KEYDOWN
LVN_ITEMCHANGED
LVN_KEYDOWN
LVN_ITEMCHANGED
LVN_KEYDOWN
LVN_KEYDOWN
LVN_ITEMCHANGED
LVN_KEYDOWN
LVN_KEYDOWN
LVN_KEYDOWN
LVN_KEYDOWN
LVN_KEYDOWN

When I run the code I get clear LVN_KEYDOWNs

Link to comment
Share on other sites

@Andreik: when you click a cell in the listview then it will be marked. If you click another cell then the old cell will unmarked and the clicked one marked.

I want to move the marker by the arrow keys up and down only but the marker shouldn't mark the complete line, only a part of it. If you have marked cell 8.0 and press the arrow up key then the marker should move up to cell 7.0. Analogue the the direction.

I don't know from which post I took the code but it is somewhere in this forum.

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

  • Solution

The solution was provided by Velted from the German forum:

;coded by LarsJ / Velted
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>

Opt("MustDeclareVars", 1)

Global $hGui, $hLV, $iLVx, $iLVy, $aHit[2] = [-1, -1]    ; $aHit contains row & col of marked cell

Example()


Func Example()

    $hGui = GUICreate("Mark Cell in Listview", 500, 540)

    Local $idLV0 = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
    For $i = 0 To 99
        GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|Cell " & $i & ".1" & "|Cell " & $i & ".2", $idLV0)
    Next
    $hLV = GUICtrlGetHandle($idLV0)
    $iLVx = 25
    $iLVy = 10

    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

EndFunc   ;==>Example

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom

        Case $hLV
            Local $iSelectedItem = _GUICtrlListView_GetSelectionMark($hLV)
            ; ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hLV) & @CRLF)

            Switch $iCode
                ; Handle arrow key presses for selection movement
                Case $NM_CUSTOMDRAW

                    Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                    Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                    Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                    Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state

                    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
                            ConsoleWrite("Row: " & $dwItemSpec & " - State: " & $uItemState & @CRLF)
                            If _GUICtrlListView_GetItemSelected($hLV, $dwItemSpec) Then
                                Return $CDRF_NOTIFYSUBITEMDRAW  ; Notify the parent window of any SUBITEM-related drawing operations
                            Else
                                Return $CDRF_DODEFAULT
                            EndIf

                        Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM) ; Before painting a subitem
                            DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT(0x11)))
                            Switch $iSubItem
                                Case 0 To 1 ; Marked column
                                    DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0xFFFFFF) ; Forecolor white
                                    DllStructSetData($tNMLVCUSTOMDRAW, "clrTextBk", 0xCC6600) ; Backcolor dark blue, BGR
                                Case Else ; Other columns
                                    DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", 0x000000) ; Forecolor black
                                    DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", 0xFFFFFF) ; Backcolor white
                            EndSwitch
                            Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors

                    EndSwitch

            EndSwitch

    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Here is another version of what I actually wanted to achieve.

 

Thanks again to Velted for the appropriate code section:

;coded by LarsJ / Velted
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>

Opt("MustDeclareVars", 1)

Global $hGui, $hLV

Example()


Func Example()

    $hGui = GUICreate("Mark Cell in Listview", 500, 540)

    Local $idLV = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
    For $i = 0 To 99
        GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|" & Hex(Int(Random() * 0xFFFFFF), 6) & "|", $idLV)
    Next
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    GUISetState()

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

EndFunc   ;==>Example

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $bIsSelected, $ClrText, $ClrTextBk
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hLV
            Switch $iCode
                ; Handle arrow key presses for selection movement
                Case $NM_CUSTOMDRAW
                    Local $tNMLVCUSTOMDRAW = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $dwDrawStage = DllStructGetData($tNMLVCUSTOMDRAW, "dwDrawStage")
                    Local $dwItemSpec = DllStructGetData($tNMLVCUSTOMDRAW, "dwItemSpec") ; Item index
                    Local $iSubItem = DllStructGetData($tNMLVCUSTOMDRAW, "iSubItem") ; Subitem index
                    Local $uItemState = DllStructGetData($tNMLVCUSTOMDRAW, "uItemState") ; Item state

                    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
                            $bIsSelected = _GUICtrlListView_GetItemSelected($hLV, $dwItemSpec)
                            If $bIsSelected Then DllStructSetData($tNMLVCUSTOMDRAW, "uItemState", BitAND($uItemState, BitNOT($CDIS_SELECTED)))
                            Switch $iSubItem
                                Case 0 To 1 ; Marked column
                                    $ClrText = $bIsSelected ? 0xFFFFFF : 0X0000000
                                    $ClrTextBk = $bIsSelected ? 0xCC6600 : 0xFFFFFF
                                Case 2
                                    $ClrText = 0x000000
                                    $ClrTextBk = "0x" & _GUICtrlListView_GetItemText($hLV, $dwItemSpec, 1)
                                Case Else ; Other columns
                                    Return $CDRF_DODEFAULT
                            EndSwitch
                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrText", $ClrText)     ; Forecolor black
                            DllStructSetData($tNMLVCUSTOMDRAW, "ClrTextBk", $ClrTextBk)     ; Backcolor white
                            Return $CDRF_NEWFONT            ; $CDRF_NEWFONT must be returned after changing font or colors
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

 

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Reading the explanation of the problem you described above, it seemed to me that you were talking about moving the selection into individual cells.
Isn't moving the entire row selection up and down using the directional keys a default feature of ListView? you don't need to use GUIRegisterMsg.

#include <GUIConstantsEx.au3>

Global $hGui, $hLV

Example()

Func Example()

    $hGui = GUICreate("Mark Cell in Listview", 500, 540)

    Local $idLV = GUICtrlCreateListView("Column 0|Column 1|Column 2", 25, 10, 250, 500)
    For $i = 0 To 99
        GUICtrlCreateListViewItem("Cell " & $i & ".0" & "|" & Hex(Int(Random() * 0xFFFFFF), 6) & "|", $idLV)
    Next

    GUISetState()

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

EndFunc   ;==>Example

.... However, things are different if you want to move the selection into "single cells" using the directional keys...

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Link to comment
Share on other sites

It is not always easy to explain what the problem is and what the goal should be.

Anyhow, thank you all for your contributions.

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
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
 Share

×
×
  • Create New...