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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#1

Message 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.
Modifié en dernier par jpascal le mar. 04 févr. 2020 09:44, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#2

Message 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é
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#3

Message 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
 
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#4

Message 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
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#5

Message 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.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#6

Message 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) ?
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

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

#7

Message 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
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

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

#8

Message 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.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre