Page 1 sur 1

Détecter la Checkbox cochée dans un TreeGadget ?

Publié : mer. 21/juin/2006 10:13
par Dräc
Microsoft ne traitant pas un TreeGadgets comme un ListIconGadgets (pour lequel le message #LVN_ITEMCHANGED existe), quelqu'un sait il détecter (par CallBack) la Checkbox qui vient d'etre cochée dans un TreeGadget ?

Publié : mer. 21/juin/2006 11:40
par Anonyme2
Regarde du côté de #TVN_SELCHANGED

Les messages du TreeGadget commencent par TVM_ (TVM_GETITEM, TVM_GETITEMSTATE etc)

Publié : mer. 21/juin/2006 11:50
par Dräc
J'ai déjà testé: cliquer sur la checkbox ne produit pas de notification #TVN_SELCHANGED car la selection ne change pas...

Publié : mer. 21/juin/2006 12:13
par lionel_om
J'avais déja essayé, mais je n'avais pas réussit

Au final, je détecté un clic droit et je regardé par rapport à une liste contenant des booléen pour savoir quelle case avait été cochée/décochée... :?

Publié : mer. 21/juin/2006 17:27
par nico
Ma première idée vu que tu ne donnes pas de code serait de tester l'item cliqué, en traitant NM_CLICK et avec l'id retrouvé l'état du state du checkbox avec le message TVM_GETITEM.

Publié : mer. 21/juin/2006 18:49
par Dräc
Bon, je ne voulais pas faire ainsi mais voici un début de solution :
je retrouve les valeurs 4096 et 8192 caractéristiques du changement d’état.
Il doit y avoir plus élégant car :
- J’ai été obligé de retrouver les coordonnées du curseur par rapport au TreeGadget
- Je n’ai que le handle de l’élément cliqué

Code : Tout sélectionner

#TVM_GETITEMSTATE = #TV_FIRST + 39 

Procedure.l WindowCallback(hWnd, Msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents

  If Msg = #WM_NOTIFY
      *lp.NMTREEVIEW = lParam
      Select *lp\hdr\code
;         Case #TVN_BEGINDRAG
;            Debug "#TVN_BEGINDRAG"
;         Case #TVN_BEGINLABELEDIT
;           Debug "#TVN_BEGINLABELEDIT"
;         Case #TVN_DELETEITEM
;            Debug "#TVN_DELETEITEM"
;         Case #TVN_ENDLABELEDIT
;            Debug "#TVN_ENDLABELEDIT"
;         Case #TVN_GETDISPINFO
;            Debug "#TVN_GETDISPINFO"
; ;         Case #TVN_ITEMEXPANDE
; ;            Debug "#TVN_ITEMEXPANDE"
;         Case #TVN_ITEMEXPANDING
;            Debug "#TVN_ITEMEXPANDING"
;         Case #TVN_KEYDOWN
;            Debug "#TVN_KEYDOWN"
;         Case #TVN_SELCHANGED
;            Debug "#TVN_SELCHANGED"
;         Case #TVN_SELCHANGING
;            Debug "#TVN_SELCHANGING"
;         Case #TVN_SETDISPINFO
;            Debug "#TVN_SETDISPINFO"
        Case #NM_CLICK
				    pt.Point\x=DesktopMouseX()
				    pt\y=DesktopMouseY()
				    GetWindowRect_(GadgetID(0),rect.RECT)
    
           lp2.TV_HITTESTINFO\pt\x=pt\x-rect\left
           lp2\pt\y=pt\y-rect\top
           lp2\flags=#TVHT_ONITEM
           SendMessage_(GadgetID(0), #TVM_HITTEST, 0, @lp2)
           Debug SendMessage_(GadgetID(0), #TVM_GETITEMSTATE, lp2\hItem, #TVIS_STATEIMAGEMASK)

      EndSelect
  EndIf
  ProcedureReturn result
EndProcedure

  If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    TreeGadget(0, 0, 10, 320, 160, #PB_Tree_CheckBoxes|#PB_Tree_NoLines)  ; liste arborescente avec cases à cocher + sans lignes reliant les noeuds
      For a = 0 To 10
        AddGadgetItem (0, -1, "Elément normal "+Str(a), 0, 0) ; si vous souhaitez ajouter une image, utilisez 
        AddGadgetItem (0, -1, "Noeud "+Str(a), 0, 0)          ; ImageID(x) comme 4ème paramètre
        AddGadgetItem (0, -1, "Sous-élément 1", 0, 1)         ; Ceux-là sont au premier sous-niveau 
        AddGadgetItem (0, -1, "Sous-élément 2", 0, 1)
        AddGadgetItem (0, -1, "Sous-élément 3", 0, 1)
        AddGadgetItem (0, -1, "Sous-élément 4", 0, 1)
        AddGadgetItem (0, -1, "Fichier "+Str(a), 0, 0) ; sous-niveau 0 à nouveau
      Next
      
      SetWindowCallback(@WindowCallback(), 0)
      
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Publié : mer. 21/juin/2006 20:28
par nico
Je crois vraiment que 'est la bonne méthode. :)

Publié : mer. 21/juin/2006 20:39
par Dräc
Non, pitié... :D
J'ai du mal à comprendre pourquoi un ListIconGadget bénéficie de toutes les infos nécessaires et qu'un TreeGadget non!
Ce sont pourtant des gadgets plutot proches.
Vraiment, quand Microsoft s'y met...

Publié : mer. 21/juin/2006 20:46
par Dräc
D'autres propositions? :|