Page 1 sur 1

[R] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 10:37
par jpascal
Bonjour,

Lorsque l'on sélecte un item dans une listview, celui-ci s'affiche sur un fond bleu.
Je souhaiterais désactiver ce comportement.

Pour une listbox, il existe le flag $LBS_NOSEL mais pas pour une listview.

L'astuce de changer le focus ne correspond pas à ma recherche car le fond devient gris.

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 12:01
par walkson
Bonjour,
Comme ceci ?
      #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>

    Global $Array1[6], $click_item = -1, $click_subitem
    $Array1[0] = "JPM"
    $Array1[1] = "Holger"
    $Array1[2] = "Jon"
    $Array1[3] = "Larry"
    $Array1[4] = "Jeremy"
    $Array1[5] = "Valik"

    $hGUI = GUICreate("Test", 300, 300)
    Global $hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems|", 10, 10, 280, 180, -1, $WS_EX_CLIENTEDGE)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    For $i = 0 To 5
         _GUICtrlListView_AddItem($hListView, "Item :" & $i)
         _GUICtrlListView_AddSubItem($hListView, $i , $Array1[$i], 1)
     Next
    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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


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

        Switch $hWndFrom
             Case $hListView
                 Switch $iCode
                     Case $NM_CLICK  ; DBLCLK
                         $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                         $click_item = DllStructGetData($tInfo, "Index")
                         $click_subItem = DllStructGetData($tInfo, "SubItem")
                         ControlListView($hGUI, "", $hListview, "DeSelect", -1)
                         _GUICtrlListView_SetItemFocused($hListView, $click_item, false)
                   $text = _GUICtrlListView_GetItemText($hListview,$click_item,$click_subItem)
                  ToolTip($text,100,100)
             EndSwitch

      EndSwitch
        Return $GUI_RUNDEFMSG
     EndFunc   ;==>WM_NOTIFY
 
A l'origine, ce code (récupéré sur le forum anglais) servait à colorer l'item sélectionné

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 12:13
par mikell
Une autre manière (forum US aussi)

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

GUICreate("", 300, 450)
Local $listView = GUICtrlCreateListView("A|B|C|D|E|F|G", 25, 25, 250, 400, -1, $LVS_EX_GRIDLINES)
For $i = 0 To 20
    GUICtrlCreateListViewItem("A" & $i & "|B" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $listView)
Next
$listView = GUICtrlGetHandle($listView)
GUISetState()

Do
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_PRIMARYDOWN
            $s_Item = GetItemClicked($listView)
            If @error = 0 Then Msgbox(0,"", $s_Item & ": was clicked")
    EndSwitch
Until $nMsg = $GUI_EVENT_CLOSE


Func GetItemClicked( $hListView )
    ;get the info
    $aInfo = _GUICtrlListView_SubItemHitTest( $hlistView )
    If $aInfo[0] = -1 Or $aInfo[1] = -1 Then Return SetError(2, 0, -1)
    If IsArray($aInfo) = 0 Then Return SetError(1, 0, -1)
    ;get the item/subitem text.
    Return _GUICtrlListView_GetItemText($hlistView, $aInfo[0], $aInfo[1])
EndFunc
 

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 16:58
par jpascal
Bonjour mikell,

Merci pour ta réponse.
Je connaissais la première solution mais la trouvant lourde, j'en espérais une autre.

Du coup j'ai testé la seconde.
Je n'ai pas compris du premier coup. Et je me suis aperçu que ça ne fonctionnait pas (les cases de la première colonne restent sélectionnées).

En fait la solution est toute simple, il suffit de créer une fausse colonne et la cacher.
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

GUICreate("", 300, 450)
Local $listView = GUICtrlCreateListView("#|A|B|C|D|E|F|G", 25, 25, 250, 400, -1, $LVS_EX_GRIDLINES) ; l'index (1ère colonne) est #
For $i = 0 To 20
   ; L'index (1ère colonne) est vide
    GUICtrlCreateListViewItem("|A" & $i & "|B" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $listView)
Next
_GUICtrlListView_SetColumnWidth($listView, 0, 0) ; On cache la première colonne
$listView = GUICtrlGetHandle($listView)
GUISetState()

Do
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_PRIMARYDOWN
            $s_Item = GetItemClicked($listView)
            If @error = 0 Then Msgbox(0,"", $s_Item & ": was clicked")
    EndSwitch
Until $nMsg = $GUI_EVENT_CLOSE


Func GetItemClicked( $hListView )
    ;get the info
    $aInfo = _GUICtrlListView_SubItemHitTest( $hlistView )
    If $aInfo[0] = -1 Or $aInfo[1] = -1 Then Return SetError(2, 0, -1)
    If IsArray($aInfo) = 0 Then Return SetError(1, 0, -1)
    ;get the item/subitem text.
    Return _GUICtrlListView_GetItemText($hlistView, $aInfo[0], $aInfo[1])
EndFunc

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 17:23
par jpascal
En revanche, ma solution n'est pas possible si l'on désire récupérer les valeurs des cellules avec :
Case $NM_CLICK
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
DllStructGetData($tInfo, 'Index')

En effet, cela nécessite de définir LVS_EX_FULLROWSELECT qui met en sélection toute la ligne.

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 17:43
par jpascal
Je viens de regarder la première solution.
En fait ce n'est pas la syntaxe à laquelle je pensais. C'est même simplissime.

La ligne ControlListView($hGUI, '', $hListView, 'DeSelect', -1) semble suffire.

A quoi sert _GUICtrlListView_SetItemFocused($hListView, $click_item, false) ?

Re: [..] Désactiver la sélection d'une listview

Posté : lun. 03 févr. 2020 19:49
par walkson
_GUICtrlListView_SetItemFocused($hListView, $click_item, false) supprime le focus. Pour voir la différence, commentez la ligne, la cellule garde le focus (bordure en pointillée)
J'ai modifié légèrement le code de Michel qui ne sélectionne plus les cellules de la première colonne
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

$hGUI = GUICreate("", 300, 450)
$label = GUICtrlCreateLabel("", 100,400, 100,25,-1,$WS_EX_CLIENTEDGE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
Local $listView = GUICtrlCreateListView("A|B|C|D|E|F|G", 25, 25, 250, 350, -1, $LVS_EX_GRIDLINES)
For $i = 0 To 20
    GUICtrlCreateListViewItem("A" & $i & "|B" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $listView)
Next
$listView = GUICtrlGetHandle($listView)
GUISetState()

Do
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_PRIMARYDOWN
            $s_Item = GetItemClicked($listView)
            If @error = 0 Then GUICtrlSetData($label, $s_Item & ": was clicked")
    EndSwitch
Until $nMsg = $GUI_EVENT_CLOSE


Func GetItemClicked( $hListView )
    ;get the info
    $aInfo = _GUICtrlListView_SubItemHitTest( $hlistView )
    If $aInfo[0] = -1 Or $aInfo[1] = -1 Then Return SetError(2, 0, -1)
    If IsArray($aInfo) = 0 Then Return SetError(1, 0, -1)
   ControlListView($hGUI, "", $hListview, "DeSelect", -1)
   _GUICtrlListView_SetItemFocused($hListView, $aInfo[0], false)
    ;get the item/subitem text.
    Return _GUICtrlListView_GetItemText($hlistView, $aInfo[0], $aInfo[1])
EndFunc

Re: [..] Désactiver la sélection d'une listview

Posté : mar. 04 févr. 2020 09:44
par jpascal
Je vois en effet la différence pour le focus.
Bizarrement, dans mon code, je n'ai pas besoin de cela, les pointillés n'apparaissent pas.
J'ai testé différents paramètres pour la Listview cela ne semble pas venir de là.

L'essentiel est que j'ai désormais deux méthodes pour cacher cette sélection.

Merci à vous deux pour vos explications.