Nouveau button gadget...

Programmation d'applications complexes
Nfred
Messages : 16
Inscription : mer. 20/avr./2005 10:35

Nouveau button gadget...

Message 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 ?
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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+
Nfred
Messages : 16
Inscription : mer. 20/avr./2005 10:35

nouvelle version...

Message 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:
Nfred
Messages : 16
Inscription : mer. 20/avr./2005 10:35

Oubli ...

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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 ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Nfred
Messages : 16
Inscription : mer. 20/avr./2005 10:35

procedure d'automatisation et "d'embellissement"

Message 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 !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Bonne idée ce gadget :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Nfred
Messages : 16
Inscription : mer. 20/avr./2005 10:35

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