TreeGadget - Ajouter une image devant l'icône

Programmation d'applications complexes
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je vais voir ce que je peux faire!
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci Senior Nico !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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)    
Dernière modification par nico le mer. 14/déc./2005 0:33, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

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

Message 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.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Ok ! On ne peut définir que 15 images ? pas plus ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Normalement non, mais tu peux faire tes propres tests!
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

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

Message 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!
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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 ?
Répondre