[..] Constante case (dé)cochée

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

[..] Constante case (dé)cochée

#1

Message par jpascal »

Bonjour,

Lorsque je souhaite déclencher une action sur une case cochée dans une listview, je fais ce test :
Case $LVN_ITEMCHANGED ; An item has changed
               $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
               If DllStructGetData($tInfo, "NewState") = 4096 Or DllStructGetData($tInfo, "NewState") = 8192 Then
La valeur 4096 correspond au nouvel état décoché et 8192 à coché.

Pour déclencher une action si la ligne est sélectionnée, j'utilise :
               ElseIf BitAND( DllStructGetData($tInfo, "NewState"), $LVIS_SELECTED) = $LVIS_SELECTED Then ; Sélection
                  _GUICtrlListView_SetItemFocused ($idListview, DllStructGetData($tInfo, "Item"), False) ; Supprime le focus
                  _GUICtrlListView_SetItemSelected($idListview, DllStructGetData($tInfo, "Item"), False) ; Déselectionne
               EndIf
J'ai trouvé la constante $LVIS_SELECTED mais je ne sais pas si c'est adapté pour mon usage. Pouvez-vous me le valider ?

Je souhaiterais effectuer le même genre de test pour détecter la case cochée/décochée
Pouvez-vous m'indiquer la constante que je dois utiliser ?
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
Anthony
Niveau 6
Niveau 6
Messages : 294
Enregistré le : lun. 17 janv. 2011 14:08
Localisation : France
Status : Hors ligne

Re: [..] Constante case (dé)cochée

#2

Message par Anthony »

Met un peu plus de code qu'on comprenne ;)
J'ai été diagnostiqué pour trouble de la concentration, soyez indulgent
Merci à tous pour votre aide.

Mon UDF GuiStatusBar facile
Yvan29
Niveau 1
Niveau 1
Messages : 1
Enregistré le : ven. 12 janv. 2024 11:02
Status : Hors ligne

Re: [..] Constante case (dé)cochée

#3

Message par Yvan29 »

Bonjour,

Pour détecter si une case dans une ListView est cochée ou décochée, vous pouvez utiliser la constante $LVIS_STATEIMAGEMASK en combinaison avec BitAND. Voici comment vous pouvez faire cela :

Code : Tout sélectionner

Case $LVN_ITEMCHANGED ; An item has changed
    $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
    $NewState = DllStructGetData($tInfo, "NewState")
    
    If BitAND($NewState, $LVIS_STATEIMAGEMASK) = 0 Then
        ; La case est décochée
        ; Effectuez votre action pour le cas décoché ici
    ElseIf BitAND($NewState, $LVIS_STATEIMAGEMASK) = $LVIS_STATEIMAGEMASK Then
        ; La case est cochée
        ; Effectuez votre action pour le cas cochée ici
    EndIf
EndCase
La constante $LVIS_STATEIMAGEMASK est utilisée pour extraire l'état de la case à cocher. Si la case est cochée, $LVIS_STATEIMAGEMASK sera égal à $LVIS_STATEIMAGEMASK, et si la case est décochée, $LVIS_STATEIMAGEMASK sera égal à 0.

Vous pouvez donc utiliser ce code pour déterminer si la case est cochée ou décochée et effectuer les actions nécessaires en conséquence. J'espère que cela vous aidera à gérer vos cases cochées/décochées dans votre ListView.
Découvrez ma page.
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Constante case (dé)cochée

#4

Message par jpascal »

Bonjour,

Merci Yvan29 pour votre réponse mais cela ne fonctionne pas.

Anthony, voici un script pour une meilleure compréhension :
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $idListview = 0

Example()

Func Example()
   GUICreate("listview items", 300, 150)

   $idListview = GUICtrlCreateListView("0|0", 10, 10, 280, 130, BitOR($LVS_NOCOLUMNHEADER, $LVS_SINGLESEL))
   _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_CHECKBOXES, $WS_EX_CLIENTEDGE))
   GUICtrlCreateListViewItem("item1|col12", $idListview)
   GUICtrlCreateListViewItem("item2|col22", $idListview)
   _GUICtrlListView_SetColumnWidth($idListview, 0, $LVSCW_AUTOSIZE)
   GUISetState(@SW_SHOW)
   GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

   While 1
      Switch GUIGetMsg()
         Case $GUI_EVENT_CLOSE
            ExitLoop
      EndSwitch
   WEnd
EndFunc   ;==>Example

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg, $wParam, $lParam
   Local $iIDFrom, $tNMHDR, $iCode, $tInfo

   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
   $iCode = DllStructGetData($tNMHDR, "Code")

   Switch $iIDFrom
      Case $idListview
         Switch $iCode
            Case $LVN_ITEMCHANGED ; An item has changed
               $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
               ConsoleWrite(@CRLF & BitAND(DllStructGetData($tInfo, "NewState"), $LVIS_STATEIMAGEMASK) & @CRLF)

               If BitAND(DllStructGetData($tInfo, "NewState"), $LVIS_STATEIMAGEMASK) = $LVIS_STATEIMAGEMASK Then ; ne fonctionne pas
                  ConsoleWrite('Case cochée' & @CRLF)

               ElseIf BitAND(DllStructGetData($tInfo, "NewState"), $LVIS_STATEIMAGEMASK) = 0 Then ; ne fonctionne pas
                  ConsoleWrite('Case décochée' & @CRLF)

               ElseIf DllStructGetData($tInfo, "NewState") = 8192 Then
                  ConsoleWrite('Case cochée (avec mon test)' & @CRLF)

               ElseIf DllStructGetData($tInfo, "NewState") = 4096 Then
                  ConsoleWrite('Case décochée (avec mon test)' & @CRLF)
               EndIf

               If BitAND(DllStructGetData($tInfo, "NewState"), $LVIS_SELECTED) = $LVIS_SELECTED Then    ; Sélection
                  ConsoleWrite('Ligne sélectionnée' & @CRLF)
               EndIf

               ; No return value
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
Numeric
Niveau 5
Niveau 5
Messages : 131
Enregistré le : mer. 23 mars 2016 08:17
Status : Hors ligne

Re: [..] Constante case (dé)cochée

#5

Message par Numeric »

L'UDF GuiListView.au3 comporte plusieurs fonctions pertinentes et utiles. Utilisez-les toujours tant que cela est possible. N'utilisez pas de constantes magiques dans vos codes. Ecrivez des codes optimisés. voici un exemple très simple:


#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
Global $idListview = 0

Example()

Func Example()
   GUICreate("listview items", 300, 150)

   $idListview = GUICtrlCreateListView("0|0", 10, 10, 280, 130, BitOR($LVS_NOCOLUMNHEADER, $LVS_SINGLESEL))
   _GUICtrlListView_SetExtendedListViewStyle($idListview, BitOR($LVS_EX_CHECKBOXES, $WS_EX_CLIENTEDGE))
   GUICtrlCreateListViewItem("item1|col12", $idListview)
   GUICtrlCreateListViewItem("item2|col22", $idListview)
   _GUICtrlListView_SetColumnWidth($idListview, 0, $LVSCW_AUTOSIZE)
   GUISetState(@SW_SHOW)
   GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

   While 1
      Switch GUIGetMsg()
         Case $GUI_EVENT_CLOSE
            ExitLoop
      EndSwitch
   WEnd
EndFunc   ;==>Example

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
   #forceref $hWnd, $iMsg
   Local $iIDFrom, $tNMHDR, $iCode, $tInfo

   $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
   $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
   $iCode = DllStructGetData($tNMHDR, "Code")

   Switch $iIDFrom
      Case $idListview
         Switch $iCode
            Case $LVN_ITEMCHANGED ; An item has changed

               $tInfo = DllStructCreate($tagNMLISTVIEW, $lParam)
               Local $item = DllStructGetData($tInfo, "Item")

               If _GUICtrlListView_GetItemChecked($wParam, $item) Then
                  ConsoleWrite("Case cochee" & @CRLF)
               Else
                  ConsoleWrite("Case decochee" & @CRLF)
               EndIf

               If _GUICtrlListView_GetItemSelected($wParam, $item) Then
                  ConsoleWrite('Ligne selectionnee' & @CRLF)
               EndIf

               ; No return value
         EndSwitch
   EndSwitch
   Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
De 0 et 1 vers les étoiles , tout part du Binaire, Numeric
Répondre