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

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

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

Message 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 ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Regarde du côté de #TVN_SELCHANGED

Les messages du TreeGadget commencent par TVM_ (TVM_GETITEM, TVM_GETITEMSTATE etc)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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...
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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... :?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je crois vraiment que 'est la bonne méthode. :)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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...
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

D'autres propositions? :|
Répondre