Page 1 sur 1

Nouveau button gadget...

Publié : jeu. 28/avr./2005 16:05
par Nfred
J'ai constaté qu'il manquait un gadget losque je voulais faire un p'tit prog ; J'ai programmé comme j'ai pu avec mes faibles connaissances.

Je suis ouvert à toute modification ou amélioration (attention Puriste, c'est du programmé-cochonnoux)... :oops:

Code : Tout sélectionner

;- programmé par Nfred
; Libre de droit !!!


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0=0
  #Button_1=1
  #Button_2=2
  #Button_3=3
  #list_icon
EndEnumeration

Structure type
  state.l
  nbutton.l
  donnee.s[50]
EndStructure
Dim boutton.type(50)

quit = 0 ; pour quitter le programme

x = 10
y = 10
XList = 50
hauteur = 40
largeur = 200
XListDecal = 30
HauteurListe = 100
NombreBoutton = 3

;{ chargement de données quelconques
Dim datalist.s(4)
datalist(1)="system"
datalist(2)="donnée"
datalist(3)="binary"
datalist(4)="ASCII ==> "
For i=0 To 3
  For j = 1 To 5
    boutton(i)\donnee[j]=datalist(i+1)+Str(j)
  Next
Next
;}

Procedure Open_Window_0(x,y,hauteur,largeur,XList,XListDecal,HauteurListe,NombreBoutton)
  If OpenWindow(#Window_0, 500, 100, 245, 348,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
    If CreateGadgetList(WindowID())
      ;ButtonImageGadget(#Button_0,10,y+(0*haut),130,haut,LoadIcon_(0, #IDI_APPLICATION))
      ButtonGadget(#Button_0, x, y+(0*hauteur), largeur, hauteur, "0")
      ButtonGadget(#Button_1, x, y+(1*hauteur), largeur, hauteur, "1")
      ButtonGadget(#Button_2, x, y+(2*hauteur), largeur, hauteur, "2")
      ButtonGadget(#Button_3, x, y+(3*hauteur), largeur, hauteur, "3")
      ListViewGadget(#list_icon,x+XListDecal,XList, (x+largeur)-(x+XListDecal),HauteurListe)
      HideGadget(#list_icon,#True)
    EndIf
  EndIf
EndProcedure

Procedure load(i)
ClearGadgetItemList(#list_icon)
  For l = 1 To 50
    If boutton(i)\donnee[l] = ""
      l=50
    Else
      AddGadgetItem(#list_icon,-1,boutton(i)\donnee[l])
    EndIf
  Next
EndProcedure

Open_Window_0(x,y,hauteur,largeur,XList,XListDecal,HauteurListe,NombreBoutton)
Repeat
  Event = WaitWindowEvent()
  If Event = #PB_EventGadget
    GadgetID = EventGadgetID()
    For i = 0 To 3                    ; On parcours tous les bouttons...
      If GadgetID = i
        Debug i
        If boutton(i)\state = 0       ;{- déploiement d'une liste
          For k = 0 To 3              ; remise à Zéro de tous les états
            boutton(k)\state = 0
          Next
          boutton(i)\state = 1        ; boutton N° i a été pressé
          j=HauteurListe                       ; les bouttons vont bouger de HauteurListe
          If i = 0                    ; clic sur le boutton 0
            
;                                          -> y+ ( la hauteur d'un boutton* par la position)
;                                         |
;                                         |
            ResizeGadget(#Button_1,x, y+(1*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            HideGadget(#list_icon,#False)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            load(i)
          ElseIf i=1                    ; clic sur le boutton 1
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            HideGadget(#list_icon,#False)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            load(i)
          ElseIf i=2                    ; clic sur le boutton 2
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            HideGadget(#list_icon,#False)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            load(i)
          ElseIf i=3                    ; clic sur le boutton 3
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur), largeur, hauteur)
            HideGadget(#list_icon,#False)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            load(i)
          EndIf
          ;}
        Else                          ;{- on replie la liste
          boutton(i)\state = 0
          j=0
          If i = 0
            ResizeGadget(#Button_1,x, y+(1*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            HideGadget(#list_icon,#True)
          ElseIf i=1
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            HideGadget(#list_icon,#True)
          ElseIf i=2
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur)+j, largeur, hauteur)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            HideGadget(#list_icon,#True)
          ElseIf i=3
            ResizeGadget(#Button_1,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(#Button_2,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(#Button_3,x, y+(3*hauteur), largeur, hauteur)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
            HideGadget(#list_icon,#True)
          EndIf
        EndIf
        ;}
      EndIf
    Next
  EndIf
Until quit = 1
Il y a un bug : si on ne met rien dans la gadgetslist, le rafraichissement ne se fait pas... :cry:

y aurait-il une façon de faire plus propre ?

Publié : jeu. 28/avr./2005 19:11
par Droopy
Bravo je vois que tu y est arrivé

modifie juste la fin : Until Event=#PB_Event_CloseWindow

sinon on ne peut quitter le programme

a+

nouvelle version...

Publié : ven. 29/avr./2005 9:16
par Nfred
version plus propre et en cours d'automatisation.
Mon but serai d'arriver à pouvoir gérer autant de boutton que l'on veut. Bref rendre ce petit prog modulable... et plus souple à gérer.

n'hésitez pas à me donner votre avis :)

Code : Tout sélectionner

;- programmé par Nfred
; Libre de droit !!!
; Version 3.0.1


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #list_icon
EndEnumeration

Structure type
  state.l
  nbutton.l
  donnee.s[50]
  img.l[2]
  text.s
EndStructure
Dim boutton.type(50)

quit = 0 ; pour quitter le programme

x = 10
y = 10
XList = 50
hauteur = 40
largeur = 200
XListDecal = 30
HauteurListe = 100
NombreBoutton = 3

;{ chargement de données quelconques
Dim datalist.s(4)
datalist(1)="system"
datalist(2)="donnée"
datalist(3)="binary"
datalist(4)="ASCII ==> "
For i=0 To 3
  For j = 1 To 5
    boutton(i)\donnee[j]=datalist(i+1)+Str(j)
  Next
Next
boutton(0)\text="Ordinateur"
boutton(1)\text="User"
boutton(2)\text="Encode"
boutton(3)\text="Serial"
boutton(0)\nbutton=0
boutton(1)\nbutton=1
boutton(2)\nbutton=2
boutton(3)\nbutton=3
;}

Procedure freeimg()
  For k = 0 To 3
    For i = 0 To 1
      FreeImage(boutton(k)\img[i])
    Next
  Next
EndProcedure

Procedure refresh(NombreBoutton) ;- rafraichit une image
  For i =0 To NombreBoutton
    SetGadgetState(boutton(i)\nbutton,UseImage(boutton(i)\img[boutton(i)\state]))
  Next
EndProcedure

Procedure ModImg() ;- modele une image (créé)
  LoadImage(100,"D:\Mes Documents\perso\my\menu\fl1.bmp")
  LoadImage(101,"D:\Mes Documents\perso\my\menu\fl2.bmp")
  For i = 0 To 1
    For k =0 To 3 
      boutton(k)\img[i]= CreateImage(#PB_Any,150,20)
      StartDrawing(ImageOutput())
      Box(0,0,150,20,RGB(236,233,216))
      BackColor(236,233,216)
      DrawingFont(LoadFont(0,"Times New Roman",12))
      FrontColor(208,208,208)
      Locate(1,1)
      DrawingMode(1)
      DrawText(boutton(k)\text)
      Locate(2,2)
      FrontColor(1,1,1)
      DrawText(boutton(k)\text)
      DrawImage(UseImage(100+i),100,3)
      StopDrawing()
    Next
  Next
  FreeImage(100)
  FreeImage(101)
EndProcedure

Procedure Open_Window_0(x,y,hauteur,largeur,XList,XListDecal,HauteurListe,NombreBoutton)
  If OpenWindow(#Window_0, 750,10, 245, 348,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
    If CreateGadgetList(WindowID())
      ;ButtonImageGadget(#Button_0,x, y+(0*hauteur), largeur, hauteur,LoadIcon_(0, #IDI_APPLICATION))
      boutton(0)\nbutton=ButtonImageGadget(#PB_Any, x, y+(0*hauteur), largeur, hauteur,UseImage(boutton(0)\img))
      boutton(1)\nbutton=ButtonImageGadget(#PB_Any, x, y+(1*hauteur), largeur, hauteur, UseImage(boutton(1)\img))
      boutton(2)\nbutton=ButtonImageGadget(#PB_Any, x, y+(2*hauteur), largeur, hauteur, UseImage(boutton(2)\img))
      boutton(3)\nbutton=ButtonImageGadget(#PB_Any, x, y+(3*hauteur), largeur, hauteur, UseImage(boutton(3)\img))
      ListViewGadget(#list_icon,x+XListDecal,XList, (x+largeur)-(x+XListDecal),HauteurListe)
      HideGadget(#list_icon,#True)
    EndIf
  EndIf
EndProcedure

Procedure load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton) ;-charge la liste
  Debug boutton(0)\state
  Debug boutton(1)\state
  Debug boutton(2)\state
  Debug boutton(3)\state
  Debug "----------------"
  ClearGadgetItemList(#list_icon)
  For l = 1 To 50                         ;remplissage de la gadget list
    If boutton(i)\donnee[l] = ""          ;jusqu'à plus de donnée
      l=50
    Else
      AddGadgetItem(#list_icon,-1,boutton(i)\donnee[l])
    EndIf
  Next
  refresh(NombreBoutton)
  
  If boutton(i)\state = 0
    HideGadget(#list_icon,#True)
  Else
    HideGadget(#list_icon,#False)
  EndIf
EndProcedure

ModImg()

Open_Window_0(x,y,hauteur,largeur,XList,XListDecal,HauteurListe,NombreBoutton)

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_EventGadget
    GadgetID = EventGadgetID()
    For i = 0 To 3                    ; On parcours tous les bouttons...
      If GadgetID = boutton(i)\nbutton
        If boutton(i)\state = 0       ;{- déploiement d'une liste
          For k = 0 To 3              ; remise à Zéro de tous les états
            boutton(k)\state = 0
          Next
          boutton(i)\state = 1        ; boutton N° i a été pressé
          j=HauteurListe                       ; les bouttons vont bouger de HauteurListe
          If i = 0                    ; clic sur le boutton 0
            
            ;                                          -> y+ ( la hauteur d'un boutton* par la position)
            ;                                         |
            ;                                         |
            
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=1                    ; clic sur le boutton 1
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=2                    ; clic sur le boutton 2
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=3                    ; clic sur le boutton 3
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur), largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(l,x+XListDecal,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          EndIf
          ;}
        Else                          ;{- on replie la liste
          boutton(i)\state = 0
          j=0
          If i = 0
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=1
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=2
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          ElseIf i=3
            ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur), largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur), largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur), largeur, hauteur)
            load(i,x,XListDecal,XList,hauteur,largeur,HauteurListe,NombreBoutton)
            ResizeGadget(#list_icon,x,XList+((i)*hauteur),(x+largeur)-(x+XListDecal),HauteurListe)
          EndIf
        EndIf
        ;}
      EndIf
    Next
  ElseIf Event = #PB_Event_CloseWindow
    quit = 1   
  EndIf
Until quit = 1
Ps: j'ai rajouté la fermeture de fenêtre comme tu me l'as demandé :wink:

Oubli ...

Publié : ven. 29/avr./2005 9:18
par Nfred
Les deux images sont deux flèches
une tournée vers la droite
l'autre tournée vers le bas.

pour tester le prog, mettez en commentaire les lignes ayant attrait au chargement de ces images.

Publié : ven. 29/avr./2005 9:30
par Le Soldat Inconnu
Oui, pour automatiser, il faut gérer les gadget par le biais d'une liste chainée par exemple

Cette liste chainée comportant un structure du type

Code : Tout sélectionner

Structure
  GadgetID
  Type ; Titre ou contenu
  Nom.s
  Etat ; ouvert ou fermé
EndStructure
Ensuite, si veux faire des trucs joli, il y a une solution toute simple, utiliser des ImageGadget
Ce gadget renvoie les clics souris comme un bouton
ensuite, en fonction de l'état du bouton, Tu changes l'images de celui-ci avec

Code : Tout sélectionner

SetGadgetState(#ImageGadget, UseImage(#Image))
Tu vois un le principe ?

procedure d'automatisation et "d'embellissement"

Publié : ven. 29/avr./2005 11:01
par Nfred
pour l'automatisation de ce programme j'ai déjà eu recours à la liste chaîné

Code : Tout sélectionner

Structure type
  state.l
  nbutton.l
  donnee.s[50]
  img.l[2]
  text.s
EndStructure
Dim boutton.type(50)
Description
state => définition de l'état du boutton (cliqué ou non)
nbutton => N° du boutton créé avec Pb_Any
donnee => donnée de la GadgetList pour un boutton donné
img => images de chaque boutton (2 images pour cliqué et non cliqué)
text => texte écrit sur le boutton

Le problème de l'automatisation viens de la partie indigeste du code où je définit l'endroit où se trouve les bouttons.

Code : Tout sélectionner

ResizeGadget(boutton(1)\nbutton,x, y+(1*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(2)\nbutton,x, y+(2*hauteur)+j, largeur, hauteur)
            ResizeGadget(boutton(3)\nbutton,x, y+(3*hauteur)+j, largeur, hauteur)
ce morceau de code change en fonction de l'endroit où l'on clique d'où difficulté d'automatisation... :?

----------------------------------------------------------------------------------------------


Sinon pour ce qui est de l'utilisation de ImageGadget, j'avoue que ça pourrait être une bonne idée mais n'ayant pas la touche graphique, j'ai préféré m'en abstenir pour commencer... Dans une version ultérieure je l'y mettrai, c'est promis ! #hydro

D'autant plus que ça sera plus facile d'en modifier l'utilisation pour un WindowScreen ou autre !

Publié : ven. 29/avr./2005 11:21
par Oliv
Bonne idée ce gadget :D

Publié : ven. 29/avr./2005 12:40
par Le Soldat Inconnu
ce morceau de code change en fonction de l'endroit où l'on clique d'où difficulté d'automatisation...
Non, en fait il faut tout redessiner de A à Z à chaque changement du style d'affichage en partant de ta liste ;)

tu places le premier bouton et tu descends de la taille du bouton
si ouvert, tu affiches le contenu et tu descends de la taille du contenu
etc ...
jusqu'a ce que tous les éléments soit placé

et pour la gestion des clic pareil, tu cherches dans la liste le gadget correspondant au clic souris.

Publié : ven. 29/avr./2005 13:21
par Nfred
façon radicalement différente ma façon de voir mais qui semble à vue de nez bien plus simple à réaliser... :10:

bravo et merci pour tes conseils !
#hello

bon ben... faut que je m'y colle ! :wink: