Accéder à l'ensemble des caractéristiques d'un Gadget

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Accéder à l'ensemble des caractéristiques d'un Gadget

Message par Dräc »

En général, pour tous les gadgets, il faudrait disposer de moyens pour récupérer l’ensemble des caractéristiques qu’il est permis de spécifier :

Deux exemples, pour une ListIconGadget :
- Il est possible de spécifier l’état de la Checkbox d’un élément ET il est possible de récupérer cet état
- Il est possible de spécifier l’image d’un élément MAIS il n’est pas possible de récupérer cette valeur (#Image)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui c'est vrai. je soutiens cette demande.

autre example,
avec le Panel/ListIcon/TreeGadget, on peut spécifier une icone.
mais on ne peut ni récupérer le pointeur sur l'image ni changer l'icone dynamiquement.

Set/GetGadgetAttribute() et Set/GetGadgetItemAttribute() devraient être beaucoup plus exploités !

D'ailleurs, je propose que tout ceux qui ont des idées aux sujet de ces 4 commandes le partage ici (sous réserve que Fred puissent implémenter ces options sur tous les OS).

#PB_ListIcon_ShowHeader ; montrer/cacher l'entete
#PB_ListIcon_Icon ; définir/récupérer l'icone d'une ligne
#PB_Tree_Icon
#PB_Panel_Icon
Image
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Toujours disposé à bénéficier d’autant de fonctionnalité Get qu’il y a de fonctionnalité Set, je dois avouer qu’il ne peut y avoir toujours stricte équivalence.

Ainsi, en cherchant le moyen de récupérer l’image d’un élément d’un ListIconGadget, j’ai constaté qu’il n’etait pas évident que cette fonction retourne le #image qui a servit lors de la création.
C’est d’ailleurs normal, car il est légitime de vouloir aussi récupérer une image d’un ListIconGadget que l’on n’a pas construit.
Donc un pointeur sur image dans ce cas est une possibilité.

Pour ma part, voici ma solution actuelle :

Code : Tout sélectionner

Procedure.l GetListIconItemImage(Gadget.l, Item.l)
lv.LVITEM\mask = #LVIF_IMAGE
lv\iItem = item
If SendMessage_(GadgetID(Gadget), #LVM_GETITEM, 0, @lv.LVITEM); on récuppère les info sur l'élément du ListIconGadget à traiter
  
  Hwnd_ListSmall = SendMessage_(GadgetID(Gadget), #LVM_GETIMAGELIST, #LVSIL_SMALL, 0); on récuppère la liste des images du ListIconGadget
  If Hwnd_ListSmall
		ImageList_GetImageInfo_(Hwnd_ListSmall, 0, @pImageInfo.IMAGEINFO); on récupère les info d'une image de la liste (ici la premiere)		
		Image=CreateImage (#PB_Any, pImageInfo\rcImage\right, pImageInfo\rcImage\bottom); pour en connaitre les dimensions et crée notre image
		
		hDC=StartDrawing (ImageOutput (Image))    
		  ImageList_Draw_(Hwnd_ListSmall,lv\iImage,hDC,0, 0,#ILD_TRANSPARENT); on dessine l'image demandée
		StopDrawing ()
  EndIf
EndIf
ProcedureReturn Image; on retourne l'image
EndProcedure
Pour un ListIconGadget donné #Gadget, la fonction GetListIconItemImage() retourne un identifiant PB de l’image associée à l’élément Item, après l'avoir reconstituée.
On peut modifier le code pour imposer l'identifiant de l'image, mais je ne vois pas de solution à base de pointeur...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

je me suis écrit quelques fonctions il y a quelques mois et j'ai procédé autrement pour récupérer les infos de l'imagelist

Je tiens une liste chaînée à jour avec les éléments voulus :
Par exemple pour le header

Code : Tout sélectionner

  Structure HeaderImage
    HeaderID.l
    ListImageAdresse.l
    HwndImage.l ; handle image ajouté à la liste
    IndexImage.l ; index de l'image ajouté correspondant à HwndImage
  EndStructure
J'ai une fonction Setimage qui affiche l'image voulue. Cette fonction va scruter la liste chainée et si l'image passée en paramètre existe dans la liste chaînée (pour n'importe quel élément , que l'image soit le handle ou l'ID static) , on connait son index dans la listImage du système, on peut soit ajouter un nouvel élément à la liste ou modifier celui qui existe.

C'est très rapide, on peut stoker plusieurs Header de plusieurs Listicon, ca va très vite.


J'ai écrit plusieurs fonctions (RemoveHeaderImage(Gadget.l, Colonne.l) etc

Je pense mettre ces commandes dans la prochaine version de ma lib mais je bosse pas trop en ce moment (fait soif :D )
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Oui, j’avais senti ton approche ici
Répondre