Page 2 sur 2

Publié : mar. 13/déc./2005 19:27
par nico
Je vais voir ce que je peux faire!

Publié : mar. 13/déc./2005 20:07
par Progi1984
Merci Senior Nico !

Publié : mar. 13/déc./2005 23:40
par nico
Pour ce code on ne peut pas utiliser la constante #PB_Tree_CheckBoxes pour le Tree.

Si il y a des chose que tu veux que je t'explique, dis le moi!

Avant de lancer le code, changer le chemin des icones.

Code : Tout sélectionner

Structure TVITEMEX 
     mask.l 
     hItem.l 
     state.l 
     stateMask.l 
     pszText.l 
     cchTextMax.l 
     iImage.l 
     iSelectedImage.l 
     cChildren.l 
     lParam.l 
     iIntegral.l 
EndStructure 

Global himl,himl_origine,himl2,himl_origine2 

Procedure Creation_Imagelist_Icon(ID_Gadget.l) 
     himl=ImageList_Create_(16, 16 , #ILC_COLOR24| #ILC_MASK,0, 0) 
     himl_origine = SendMessage_(GadgetID(ID_Gadget.l),#TVM_GETIMAGELIST,#TVSIL_NORMAL,0) 
     SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_NORMAL,himl) 
     LoadImage(0, "c:\Icon.ico") 
     LoadImage(1, "c:\Icon2.ico") 
     LoadImage(2, "c:\Icon3.ico")      
     
     For Index=0 To 2 
          geticoninfo_(UseImage(Index), @ICONINFO.ICONINFO) 
          ImageList_Add_(himl,ICONINFO\hbmColor,ICONINFO\hbmMask) 
          FreeImage(Index) 
     Next 
EndProcedure 

Procedure Creation_Imagelist_Image(ID_Gadget.l) 
     himl2=ImageList_Create_(64, 12 , #ILC_COLOR24,0, 0) 
     himl_origine2 = SendMessage_(GadgetID(ID_Gadget.l),#TVM_GETIMAGELIST,#TVSIL_STATE,0) 
     SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_STATE,himl2) 
     
     For Image=0 To 8 
          Index=CreateImage(#PB_Any,64,12) 
          If Index 
               StartDrawing(ImageOutput()) 
               Box(0,0,64,12,RGB(255,0,0)) 
               Box(0,0,x,12,RGB(0,0,255)) 
               StopDrawing() 
          EndIf      
          ImageList_Add_(himl2,UseImage(Index),0)  
          If Image=0 
               ;cette image ne servira pas 
               ImageList_Add_(himl2,UseImage(Index),0)  
          EndIf 
          FreeImage(Index) 
          x=x+64/8 
     Next Image      
EndProcedure 

Procedure Attach_Icon(ID_Gadget.l,Index_Item.l,Index_Icon.b) 
     hItem=GadgetItemID(ID_Gadget,Index_Item) 
     LPTVITEMEX.TVITEMEX 
     LPTVITEMEX\mask=#TVIF_IMAGE|#TVIF_SELECTEDIMAGE|#TVIF_HANDLE 
     LPTVITEMEX\hItem=hItem 
     LPTVITEMEX\iImage=Index_Icon 
     LPTVITEMEX\iSelectedImage=Index_Icon      
     lResult = SendMessage_(GadgetID(ID_Gadget),#TVM_SETITEM,0,LPTVITEMEX) 
EndProcedure  

Procedure Attach_Image(ID_Gadget.l,Index_Item.l,Index_Image.b) 
     hItem=GadgetItemID(ID_Gadget,Index_Item) 
     LPTVITEMEX.TVITEMEX 
     LPTVITEMEX\mask=#TVIF_HANDLE|#TVIF_STATE 
     LPTVITEMEX\hItem=hItem 
     LPTVITEMEX\stateMask=#TVIS_STATEIMAGEMASK 
     LPTVITEMEX\state=Index_Image<<12 
     lResult = SendMessage_(GadgetID(ID_Gadget),#TVM_SETITEM,0,LPTVITEMEX) 
EndProcedure      

If OpenWindow(0,0,0,370,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0)) 
     TreeGadget(0, 10,10,300,160)                    
     AddGadgetItem (0, -1, "Normal Item")    
     AddGadgetItem (0, -1, "Node")            
     OpenTreeGadgetNode(0) 
     AddGadgetItem(0, -1, "Sub-Item 1") 
     AddGadgetItem(0, -1, "Sub-Item 2") 
     AddGadgetItem(0, -1, "Sub-Item 3") 
     AddGadgetItem(0, -1, "Sub-Item 4") 
     CloseTreeGadgetNode(0) 
     AddGadgetItem (0, -1, "File") 
     AddGadgetItem (0, -1, "File") 
     
     Creation_Imagelist_Image(0) 
     ;l'index_icon doit commencer à 1 
     ;un 0 signifie qu'il n'y a plus d'image associée 
     Attach_Image(0,0,4) 
     Attach_Image(0,1,4) 
     Attach_Image(0,2,6) 
     
     Creation_Imagelist_Icon(0) 
     ;Par défaut tous les items auront l'icone d'index 0 
     Attach_Icon(0,0,0) 
     Attach_Icon(0,1,1) 
     
     Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 

ImageList_Destroy_(himl) 
ImageList_Destroy_(himl2)    

Publié : mar. 13/déc./2005 23:59
par Progi1984
Il y a pas un bug ?

Si tu changes le dernier paramètre, rien ne se passe !

Code : Tout sélectionner

Attach_Image(0,1,4)
Comment afficher des images différentes ?

Publié : mer. 14/déc./2005 0:03
par Progi1984
Je l'ai modifié et grace à toi, jai compris :

En fait, c'est comme le rtf, pour les couleurs, on gère une liste d'image, et on choisit via un nombre laquelle afficher, pareil pour les icones !
Me suis je trompé ?

Code : Tout sélectionner

Structure TVITEMEX 
     mask.l 
     hItem.l 
     state.l 
     stateMask.l 
     pszText.l 
     cchTextMax.l 
     iImage.l 
     iSelectedImage.l 
     cChildren.l 
     lParam.l 
     iIntegral.l 
EndStructure 

Global himl,himl_origine,himl2,himl_origine2 

Procedure Creation_Imagelist_Icon(ID_Gadget.l) 
     himl=ImageList_Create_(16, 16 , #ILC_COLOR24| #ILC_MASK,0, 0) 
     himl_origine = SendMessage_(GadgetID(ID_Gadget.l),#TVM_GETIMAGELIST,#TVSIL_NORMAL,0) 
     SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_NORMAL,himl) 
     LoadImage(0, "prime0.ico") 
     LoadImage(1, "prime1.ico") 
     LoadImage(2, "prime2.ico")      
     
     For Index=0 To 2 
          geticoninfo_(UseImage(Index), @ICONINFO.ICONINFO) 
          ImageList_Add_(himl,ICONINFO\hbmColor,ICONINFO\hbmMask) 
          FreeImage(Index) 
     Next 
EndProcedure 

Procedure Creation_Imagelist_Image(ID_Gadget.l) 
     himl2=ImageList_Create_(64, 12 , #ILC_COLOR24,0, 0) 
     himl_origine2 = SendMessage_(GadgetID(ID_Gadget.l),#TVM_GETIMAGELIST,#TVSIL_STATE,0) 
     SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_STATE,himl2) 
     
     For Image=0 To 10 
          Index=CreateImage(#PB_Any,64,12) 
          If Index 
               StartDrawing(ImageOutput()) 
               Box(0,0,64,12,RGB(255,0,0)) 
               Box(0,0,Image*10,12,RGB(0,0,255)) 
               StopDrawing() 
          EndIf      
          ImageList_Add_(himl2,UseImage(Index),0) 
          If Image=0 
               ;cette image ne servira pas 
               ImageList_Add_(himl2,UseImage(Index),0) 
          EndIf 
          FreeImage(Index) 
          x=x+64/8 
     Next Image      
EndProcedure 

Procedure Attach_Icon(ID_Gadget.l,Index_Item.l,Index_Icon.b) 
     hItem=GadgetItemID(ID_Gadget,Index_Item) 
     LPTVITEMEX.TVITEMEX 
     LPTVITEMEX\mask=#TVIF_IMAGE|#TVIF_SELECTEDIMAGE|#TVIF_HANDLE 
     LPTVITEMEX\hItem=hItem 
     LPTVITEMEX\iImage=Index_Icon 
     LPTVITEMEX\iSelectedImage=Index_Icon      
     lResult = SendMessage_(GadgetID(ID_Gadget),#TVM_SETITEM,0,LPTVITEMEX) 
EndProcedure 

Procedure Attach_Image(ID_Gadget.l,Index_Item.l,Index_Image.b) 
     hItem=GadgetItemID(ID_Gadget,Index_Item) 
     LPTVITEMEX.TVITEMEX 
     LPTVITEMEX\mask=#TVIF_HANDLE|#TVIF_STATE 
     LPTVITEMEX\hItem=hItem 
     LPTVITEMEX\stateMask=#TVIS_STATEIMAGEMASK 
     LPTVITEMEX\state=Index_Image<<12 
     lResult = SendMessage_(GadgetID(ID_Gadget),#TVM_SETITEM,0,LPTVITEMEX) 
EndProcedure      

If OpenWindow(0,0,0,370,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0)) 
     TreeGadget(0, 10,10,300,160)                    
     AddGadgetItem (0, -1, "Normal Item")    
     AddGadgetItem (0, -1, "Node")            
     OpenTreeGadgetNode(0) 
     AddGadgetItem(0, -1, "Sub-Item 1") 
     AddGadgetItem(0, -1, "Sub-Item 2") 
     AddGadgetItem(0, -1, "Sub-Item 3") 
     AddGadgetItem(0, -1, "Sub-Item 4") 
     CloseTreeGadgetNode(0) 
     AddGadgetItem (0, -1, "File") 
     AddGadgetItem (0, -1, "File") 
     
     Creation_Imagelist_Image(0) 
     ;l'index_Image doit commencer à 1 
     ;un 0 signifie qu'il n'y a plus d'image associée 
     Attach_Image(0,0,2) 
     Attach_Image(0,1,4) 
     Attach_Image(0,2,6) 
     
     Creation_Imagelist_Icon(0) 
     ;Par défaut tous les items auront l'icone d'index 0 
     Attach_Icon(0,0,0) 
     Attach_Icon(0,1,1) 
     
     Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 

ImageList_Destroy_(himl) 
ImageList_Destroy_(himl2)  

Publié : mer. 14/déc./2005 0:49
par nico
Oui c'est ça!

Les treeviews ont deux listes d'images:

Code : Tout sélectionner

SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_NORMAL,himl)
La première sert pour afficher l'icone pour l'item dans son état normal ou dans son état sélectionné (elles peuvent être différentes en choisissant un index unique pour chaque item)

Cette liste sert aussi à gérer des icones de recouvrement qui se superpose à l'icone affichée! (pas utile dans notre cas)

Code : Tout sélectionner

SendMessage_(GadgetID(ID_Gadget.l),#TVM_SETIMAGELIST,#TVSIL_STATE,himl2)
La deuxième liste d'images sert à afficher une image où icone à coté du premier qui correspondra à son icone d'état. Typiquement elle sert à afficher un checkbox mais on peut s'en servir pour afficher une icone de son choix. On peut définir au maximum 15 icones dans cette liste (4 bits servent à déterminer son index d'où le décalage (<<12), l'index 0 bien qu'ayant une image ne sera pas affichée, si on l'utilise cette valeur l'image associée précédente disparait), j'en ai créé 8 dans l'exemple.

Publié : mer. 14/déc./2005 7:35
par Progi1984
Ok ! On ne peut définir que 15 images ? pas plus ?

Publié : mer. 14/déc./2005 17:32
par nico
Normalement non, mais tu peux faire tes propres tests!

Publié : mer. 14/déc./2005 17:36
par Progi1984
Nico a écrit : On peut définir au maximum 15 icones dans cette liste (4 bits servent à déterminer son index d'où le décalage (<<12),
Donc si on assigne 5 bits à l'index, 63 icones mais

comment calcules tu le décalage ?

Publié : mer. 14/déc./2005 19:21
par nico
Le décalage reste le même, il est sans rapport avec le nombre de bit.
Je fais un décalage de 12 pour me caler sur le bit 12.
Je viens de regarder msdn et apparemment on ne peut pas dépasser 4 bits et pourtant c'est un long il reste 16 bits qui ne servent pas!

Publié : mer. 14/déc./2005 21:17
par Progi1984
Aprés test,
si on assigne 15 à une image, cela fonctionne
sinon on recommence à 0 !

Ainsi 16=0
17=1
etc...

Il est pas possible de créer deux lists d'images pour un meme gadget ?