Page 1 sur 1

[Résolu] Rendre un code plus court

Publié : ven. 10/janv./2014 10:28
par Micoute
Bonjour à tous,
Je voudrais raccourcir mon programme en supprimant les actions du genre :
Case Interrupteur1
If GetGadgetState(Interrupteur1)
SetGadgetText(Texte1, "Ouvert")
Else
SetGadgetText(Texte1, "Fermé")
EndIf
Case Interrupteur2
If GetGadgetState(Interrupteur2)
SetGadgetText(Texte2, "Ouvert")
Else
SetGadgetText(Texte2, "Fermé")
EndIf
car s'il y a un grand nombre d'interrupteurs, ça devient vite un listing style roman.

J'avais pensé à mettre dans ma structure MonGadget l'information Texte.s et selon l'état du gadget on change la valeur de Texte, soit "Ouvert" ou "Fermé", mais je tourne en rond sans trouver la solution, donc voici mon code d'origine:

Code : Tout sélectionner

;Interrupteurs

Structure PB_Interrupteur
  Type.l
  Taille.l
  Rappel.i
  Liberation.i
  ObtenirEtat.i
  DefinirEtat.i
EndStructure

ImportC "" 
  PB_Event_AddWithData(a,b,c,d,e,f)   
EndImport

; Faites vos propres constantes
Enumeration 
  #CHANGER_ETAT = #WM_USER
  #OBTENIR_ETAT
  #DEFINIR_ETAT
EndEnumeration

Structure Rect2
  Gauche.l
  Haut.l
  Droite.l
  Bas.l
EndStructure


Structure MonGadget
  IdGadget.i
  AncProc.i
  Etat.i
  Couleur.i
EndStructure

Global.s Texte

Procedure Interrupteur__ObtenirEtat(*IdGadget.integer)
  ProcedureReturn SendMessage_(*IdGadget\i, #OBTENIR_ETAT, 0, 0)
EndProcedure

Procedure Interrupteur__DefinirEtat(*IdGadget.integer, Etat)   
  SendMessage_(*IdGadget\i, #DEFINIR_ETAT, 0, Etat)   
EndProcedure

Procedure MonGadgetProc(hWnd, Msg, wParam, lParam)
  Protected *mg.MonGadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
  Protected x , y, hdc, rect.Rect2
  Protected Proc
  
  proc = *mg\AncProc
  
  If Msg = #WM_PAINT
    
    hdc = StartDrawing(CanvasOutput(*mg\IdGadget))
    
    If *mg\Etat = 0            
      *mg\Couleur = $7779E9
    Else
      *mg\Couleur = $9CE3AA
    EndIf
    
    Box(0, 0, GadgetWidth(*mg\IdGadget), GadgetHeight(*mg\IdGadget), *mg\Couleur)
    
    Rect\Droite = GadgetWidth(*mg\IdGadget)
    
    Rect\Bas = GadgetHeight(*mg\IdGadget) 
    
    DrawEdge_(hdc, Rect, #BDR_SUNKENINNER, #BF_RECT)
    
    If *mg\Etat = 0
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2            
    Else
      Rect\Gauche  = GadgetWidth(*mg\IdGadget) / 2      
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2 + Rect\Gauche         
    EndIf
    
    Rect\Gauche + 1
    Rect\Haut   = 1
    Rect\Bas    - 1
    
    DrawFrameControl_(hdc, Rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)
    
    StopDrawing()
  EndIf
  
  If Msg = #OBTENIR_ETAT
    ProcedureReturn *mg\Etat
  EndIf
  
  If Msg = #DEFINIR_ETAT
    *mg\Etat = lparam
    SendMessage_(hWnd, #WM_PAINT, 0, 0)   
  EndIf   
  
  If Msg = #WM_LBUTTONUP      
    *mg\Etat ! 1      
    PB_Event_AddWithData($332C, *mg\IdGadget, 0, #PB_EventType_Change, 0, 0)      
    SendMessage_(hWnd, #WM_PAINT, 0, 0)      
  EndIf      
  
  If Msg = #WM_DESTROY
    SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
    FreeMemory(*mg)
  EndIf
  
  ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure


Procedure MonGadget(id, x, y, largeur, hauteur)
  
  Protected gadget
  Protected *mg.MonGadget
  Protected *Interrupteur.PB_Interrupteur
  
  *mg = AllocateMemory(SizeOf(MonGadget))
  
  gadget = CanvasGadget(id, x, y, largeur, hauteur, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
  
  If id = #PB_Any
    *mg\IdGadget = gadget
  Else
    *mg\IdGadget = id
  EndIf   
  
  ;Stocker des données dans le gadget
  SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_USERDATA, *mg)
  
  ;Rappel
  *mg\AncProc = SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_WNDPROC, @MonGadgetProc())
  
  ;Ensemble de ObtenirEtat et DefinirEtat
  *Interrupteur = PeekI(IsGadget(*mg\IdGadget) + SizeOf(Integer))
  
  *Interrupteur\ObtenirEtat    = @Interrupteur__ObtenirEtat()   
  *Interrupteur\DefinirEtat    = @Interrupteur__DefinirEtat()
  
  ProcedureReturn gadget
EndProcedure

;TEST
Procedure Principale()
  
  Protected window
  Protected gadget
  Protected event
  
  Fenetre = OpenWindow(#PB_Any, 0, 0, 320, 260, "Interrupteurs", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)   
  
  Interrupteur1 =  MonGadget(#PB_Any, 10, 10, 70, 40)
  Interrupteur2 =  MonGadget(#PB_Any, 10, GadgetY(Interrupteur1)+GadgetHeight(Interrupteur1)+10, 70, 40)
  Interrupteur3 =  MonGadget(#PB_Any, 10, GadgetY(Interrupteur2)+GadgetHeight(Interrupteur2)+10, 70, 40)
  Interrupteur4 =  MonGadget(#PB_Any, 10, GadgetY(Interrupteur3)+GadgetHeight(Interrupteur3)+10, 70, 40)
  Interrupteur5 =  MonGadget(#PB_Any, 10, GadgetY(Interrupteur4)+GadgetHeight(Interrupteur4)+10, 70, 40)
  
  Interrupteur6 =  MonGadget(#PB_Any, GadgetX(Interrupteur1)+150, GadgetY(Interrupteur1), 70, 40)
  Interrupteur7 =  MonGadget(#PB_Any, GadgetX(Interrupteur2)+150, GadgetY(Interrupteur6)+GadgetHeight(Interrupteur6)+10, 70, 40)
  Interrupteur8 =  MonGadget(#PB_Any, GadgetX(Interrupteur3)+150, GadgetY(Interrupteur7)+GadgetHeight(Interrupteur7)+10, 70, 40)
  Interrupteur9 =  MonGadget(#PB_Any, GadgetX(Interrupteur4)+150, GadgetY(Interrupteur8)+GadgetHeight(Interrupteur8)+10, 70, 40)
  Interrupteur10 = MonGadget(#PB_Any, GadgetX(Interrupteur5)+150, GadgetY(Interrupteur9)+GadgetHeight(Interrupteur9)+10, 70, 40)
  
  Texte1 =  TextGadget(#PB_Any, GadgetWidth(Interrupteur1)+20, GadgetHeight(Interrupteur1)/4+GadgetY(Interrupteur1), 30, 20, "Fermé")  
  Texte2 =  TextGadget(#PB_Any, GadgetWidth(Interrupteur2)+20, GadgetHeight(Interrupteur1)/4+GadgetY(Interrupteur2), 30, 20, "Ouvert")
  Texte3 =  TextGadget(#PB_Any, GadgetWidth(Interrupteur3)+20, GadgetHeight(Interrupteur2)/4+GadgetY(Interrupteur3), 30, 20, "Ouvert")
  Texte4 =  TextGadget(#PB_Any, GadgetWidth(Interrupteur4)+20, GadgetHeight(Interrupteur3)/4+GadgetY(Interrupteur4), 30, 20, "Fermé")
  Texte5 =  TextGadget(#PB_Any, GadgetWidth(Interrupteur5)+20, GadgetHeight(Interrupteur4)/4+GadgetY(Interrupteur5), 30, 20, "Fermé")
  
  Texte6 =  TextGadget(#PB_Any, GadgetX(Interrupteur6) +GadgetWidth(Interrupteur6) +20, GadgetY(Interrupteur6) +GadgetHeight(Interrupteur6) /4, 30, 20, "Ouvert")
  Texte7 =  TextGadget(#PB_Any, GadgetX(Interrupteur7) +GadgetWidth(Interrupteur7) +20, GadgetY(Interrupteur7) +GadgetHeight(Interrupteur7) /4, 30, 20, "Fermé")
  Texte8 =  TextGadget(#PB_Any, GadgetX(Interrupteur8) +GadgetWidth(Interrupteur8) +20, GadgetY(Interrupteur8) +GadgetHeight(Interrupteur8) /4, 30, 20, "Fermé")
  Texte9 =  TextGadget(#PB_Any, GadgetX(Interrupteur9) +GadgetWidth(Interrupteur9) +20, GadgetY(Interrupteur9) +GadgetHeight(Interrupteur6) /4, 30, 20, "Ouvert")
  Texte10 = TextGadget(#PB_Any, GadgetX(Interrupteur10)+GadgetWidth(Interrupteur10)+20, GadgetY(Interrupteur10)+GadgetHeight(Interrupteur10)/4, 30, 20, "Ouvert")
  
  
  SetGadgetState(Interrupteur2, 1)
  SetGadgetState(Interrupteur3, 1)
  
  SetGadgetState(Interrupteur6, 1)
  SetGadgetState(Interrupteur9, 1)
  SetGadgetState(Interrupteur10, 1)
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_CloseWindow
      Break
    EndIf
    
    If event = #PB_Event_Gadget
      
      If EventType() = #PB_EventType_Change
        Select EventGadget()
          Case Interrupteur1
            If GetGadgetState(Interrupteur1)
              SetGadgetText(Texte1, "Ouvert")
            Else
              SetGadgetText(Texte1, "Fermé")
            EndIf
          Case Interrupteur2
            If GetGadgetState(Interrupteur2)
              SetGadgetText(Texte2, "Ouvert")
            Else
              SetGadgetText(Texte2, "Fermé")
            EndIf
          Case Interrupteur3
            If GetGadgetState(Interrupteur3)
              SetGadgetText(Texte3, "Ouvert")
            Else
              SetGadgetText(Texte3, "Fermé")
            EndIf
          Case Interrupteur4
            If GetGadgetState(Interrupteur4)
              SetGadgetText(Texte4, "Ouvert")
            Else
              SetGadgetText(Texte4, "Fermé")
            EndIf
          Case Interrupteur5
            If GetGadgetState(Interrupteur5)
              SetGadgetText(Texte5, "Ouvert")
            Else
              SetGadgetText(Texte5, "Fermé")
            EndIf
          Case Interrupteur6
            If GetGadgetState(Interrupteur6)
              SetGadgetText(Texte6, "Ouvert")
            Else
              SetGadgetText(Texte6, "Fermé")
            EndIf
          Case Interrupteur7
            If GetGadgetState(Interrupteur7)
              SetGadgetText(Texte7, "Ouvert")
            Else
              SetGadgetText(Texte7, "Fermé")
            EndIf
          Case Interrupteur8
            If GetGadgetState(Interrupteur8)
              SetGadgetText(Texte8, "Ouvert")
            Else
              SetGadgetText(Texte8, "Fermé")
            EndIf
          Case Interrupteur9
            If GetGadgetState(Interrupteur9)
              SetGadgetText(Texte9, "Ouvert")
            Else
              SetGadgetText(Texte9, "Fermé")
            EndIf
          Case Interrupteur10
            If GetGadgetState(Interrupteur10)
              SetGadgetText(Texte10, "Ouvert")
            Else
              SetGadgetText(Texte10, "Fermé")
            EndIf
        EndSelect            
      EndIf
      
    EndIf      
    
  ForEver
  
EndProcedure
End Principale()
Et voici la solution:

Code : Tout sélectionner

;Interupteurs

Structure PB_Interrupteur
  Type.l
  Taille.l
  Rappel.i
  Liberation.i
  ObtenirEtat.i
  DefinirEtat.i
EndStructure

ImportC "" 
  PB_Event_AddWithData(a,b,c,d,e,f)   
EndImport

; Faites vos propres constantes
Enumeration 
  #CHANGER_ETAT = #WM_USER
  #OBTENIR_ETAT
  #DEFINIR_ETAT
EndEnumeration

Structure Rect2
  Gauche.l
  Haut.l
  Droite.l
  Bas.l
EndStructure


Structure MonGadget
  IdGadget.i
  AncProc.i
  Etat.i
  Couleur.i
EndStructure

Procedure Interrupteur__ObtenirEtat(*IdGadget.integer)
  ProcedureReturn SendMessage_(*IdGadget\i, #OBTENIR_ETAT, 0, 0)
EndProcedure

Procedure Interrupteur__DefinirEtat(*IdGadget.integer, Etat)   
  SendMessage_(*IdGadget\i, #DEFINIR_ETAT, 0, Etat)   
EndProcedure

Procedure MonGadgetProc(hWnd, Msg, wParam, lParam)
  Protected *mg.MonGadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
  Protected x , y, hdc, rect.Rect2
  Protected Proc
  
  proc = *mg\AncProc
  
  If Msg = #WM_PAINT
    
    hdc = StartDrawing(CanvasOutput(*mg\IdGadget))
    
    If *mg\Etat = 0            
      *mg\Couleur = $7779E9
    Else
      *mg\Couleur = $9CE3AA
    EndIf
    
    Box(0, 0, GadgetWidth(*mg\IdGadget), GadgetHeight(*mg\IdGadget), *mg\Couleur)
    
    Rect\Droite = GadgetWidth(*mg\IdGadget)
    
    Rect\Bas = GadgetHeight(*mg\IdGadget) 
    
    DrawEdge_(hdc, Rect, #BDR_SUNKENINNER, #BF_RECT)
    
    If *mg\Etat = 0
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2            
    Else
      Rect\Gauche  = GadgetWidth(*mg\IdGadget) / 2      
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2 + Rect\Gauche         
    EndIf
    
    Rect\Gauche + 1
    Rect\Haut   = 1
    Rect\Bas    - 1
    
    DrawFrameControl_(hdc, Rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)
    
    StopDrawing()
  EndIf
  
  If Msg = #OBTENIR_ETAT
    ProcedureReturn *mg\Etat
  EndIf
  
  If Msg = #DEFINIR_ETAT
    *mg\Etat = lparam
    SendMessage_(hWnd, #WM_PAINT, 0, 0)   
  EndIf   
  
  If Msg = #WM_LBUTTONUP      
    *mg\Etat ! 1      
    PB_Event_AddWithData($332C, *mg\IdGadget, 0, #PB_EventType_Change, 0, 0)      
    SendMessage_(hWnd, #WM_PAINT, 0, 0)      
  EndIf      
  
  If Msg = #WM_DESTROY
    SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
    FreeMemory(*mg)
  EndIf
  
  ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure


Procedure MonGadget(id, x, y, largeur, hauteur)
  
  Protected gadget
  Protected *mg.MonGadget
  Protected *Interrupteur.PB_Interrupteur
  
  *mg = AllocateMemory(SizeOf(MonGadget))
  
  gadget = CanvasGadget(id, x, y, largeur, hauteur, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
  
  If id = #PB_Any
    *mg\IdGadget = gadget
  Else
    *mg\IdGadget = id
  EndIf   
  
  ;Stocker des données dans le gadget
  SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_USERDATA, *mg)
  
  ;Rappel
  *mg\AncProc = SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_WNDPROC, @MonGadgetProc())
  
  ;Ensemble de ObtenirEtat et DefinirEtat
  *Interrupteur = PeekI(IsGadget(*mg\IdGadget) + SizeOf(Integer))
  
  *Interrupteur\ObtenirEtat    = @Interrupteur__ObtenirEtat()   
  *Interrupteur\DefinirEtat    = @Interrupteur__DefinirEtat()
  
  ProcedureReturn gadget
EndProcedure

;***TEST***
#NBRE_INTER = 10
Enumeration Gadgets
  #inter0
  #inter1
  #inter2
  #inter3
  #inter4
  #inter5
  #inter6
  #inter7
  #inter8
  #inter9
  #Texte0
  #Texte1
  #Texte2
  #Texte3
  #Texte4
  #Texte5
  #Texte6
  #Texte7
  #Texte8
  #Texte9
EndEnumeration

Macro MonInter(NumInter, X ,Y)
  MonGadget(NumInter, X, Y, largeurInter, HauteurInter)
EndMacro      

Procedure Principale()
  
  Protected Fenetre
  Protected gadget
  Protected event
  
  Fenetre = OpenWindow(#PB_Any, 0, 0, 320, 260, "#inters", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)   
  
  LargeurInter = 70
  HauteurInter = 40
  
  MonInter(#inter0, 10, 10)
  MonInter(#inter1, 10, GadgetY(#inter0) + GadgetHeight(#inter0) + 10)
  MonInter(#inter2, 10, GadgetY(#inter1) + GadgetHeight(#inter1) + 10)
  MonInter(#inter3, 10, GadgetY(#inter2) + GadgetHeight(#inter2) + 10)
  MonInter(#inter4, 10, GadgetY(#inter3) + GadgetHeight(#inter3) + 10)
  
  MonInter(#inter5, GadgetX(#inter0) + 150, GadgetY(#inter0))
  MonInter(#inter6, GadgetX(#inter1) + 150, GadgetY(#inter5) + GadgetHeight(#inter5) + 10)
  MonInter(#inter7, GadgetX(#inter2) + 150, GadgetY(#inter6) + GadgetHeight(#inter6) + 10)
  MonInter(#inter8, GadgetX(#inter3) + 150, GadgetY(#inter7) + GadgetHeight(#inter7) + 10)
  MonInter(#inter9, GadgetX(#inter4) + 150, GadgetY(#inter8) + GadgetHeight(#inter8) + 10)
  
  TextGadget(#Texte0, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter0), 30, 20, "Fermé")  
  TextGadget(#Texte1, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter1), 30, 20, "Ouvert")
  TextGadget(#Texte2, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter2), 30, 20, "Ouvert")
  TextGadget(#Texte3, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter3), 30, 20, "Fermé")
  TextGadget(#Texte4, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter4), 30, 20, "Fermé")
  
  TextGadget(#Texte5, GadgetX(#inter5) + LargeurInter + 20, GadgetY(#inter5) + HauteurInter /4, 30, 20,
             "Ouvert")
  TextGadget(#Texte6, GadgetX(#inter6) + LargeurInter + 20, GadgetY(#inter6) + HauteurInter /4, 30, 20,
             "Fermé")
  TextGadget(#Texte7, GadgetX(#inter7) + LargeurInter + 20, GadgetY(#inter7) + HauteurInter /4, 30, 20, 
             "Fermé")
  TextGadget(#Texte8, GadgetX(#inter8) + LargeurInter + 20, GadgetY(#inter8) + HauteurInter /4, 30, 20, 
             "Ouvert")
  TextGadget(#Texte9, GadgetX(#inter9) + LargeurInter + 20, GadgetY(#inter9) + HauteurInter /4, 30, 20, 
             "Ouvert")
  
  
  SetGadgetState(#inter1, 1)
  SetGadgetState(#inter2, 1)
  
  SetGadgetState(#inter5, 1)
  SetGadgetState(#inter8, 1)
  SetGadgetState(#inter9, 1)
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_CloseWindow
      Break
    EndIf
    
    If event = #PB_Event_Gadget
      
      If EventType() = #PB_EventType_Change
        Select EventGadget()
          Case #inter0 To #NBRE_INTER
            If GetGadgetState(EventGadget())
              SetGadgetText(EventGadget() + 10, "Ouvert")
            Else
              SetGadgetText(EventGadget() + 10, "Fermé")
            EndIf          
        EndSelect            
      EndIf
      
    EndIf      
    
  ForEver
  
EndProcedure
End Principale()

Re: Rendre un code plus court

Publié : ven. 10/janv./2014 11:25
par Ar-S
Salut Micoute.

Tes inters ont un numéro alloué automatiquement du fait de tes PB_Any, ces identifiants ne se suivent pas
Ce serait plus jusdicieux de les enumérer puis de simplement utilise un For / Next.

Que ce soi pour la création comme pour le traitement.

Code : Tout sélectionner

Enumeration Inter
#inter1
#inter2
#inter3
#inter4
#inter5
#inter6
#inter7
#inter8
#inter9
#inter10
EndEnumeration
Idem pour tes textes

Tu peux aussi créer un Macro de ce genre en début de code

Code : Tout sélectionner

Macro MonInter(NumInter)
        MonGadget(NumInter, 10, GadgetY(NumInter)+GadgetHeight(NumInter)+10, 70, 40)
EndMacro
Lors de ta création de gadgets un truc de ce style suffirait alors.

Code : Tout sélectionner

	MonGadget(#Interrupteur1, 10, 10, 70, 40)
	For i = #Interrupteur2 To #Interrupteur10
		MonInter(i)
	Next i
Pareil pour le traitement.
J'ai pas testé mais ça devrait le faire, là je décroche je dois partir, j'espère que ça t'aiguillera.

Re: Rendre un code plus court

Publié : ven. 10/janv./2014 11:57
par MLD
Salut Micoute

Pourquoi tn ne fais pas un tableau des inters
Ensuite tu traites dans une boucle. :wink:

Re: Rendre un code plus court

Publié : ven. 10/janv./2014 15:06
par Micoute
Bonjour MLD,

en fait, ce n'est pas les inters qui me causent problème, mais plutôt comment connaître l'état où ils se trouvent, car qu'il ouverts ou fermés, j'ai toujours la valeur que j'ai mise par défaut. :roll:

Re édition:

Énormes mercis à Ar-s et à MLD pour leur contribution inestimable !

Re:Rendre un code plus court

Publié : sam. 11/janv./2014 15:43
par falsam
Bonjour Micoute. Le sujet est résolu c'est vrai, mais j'ajouterais quand même cette astuce :)

Je me suis servi de l'énumération avec un pas déterminé. Le code qui suit permet de créer cinq boutons.

Code : Tout sélectionner

Enumeration Windows
  #Mainform
EndEnumeration

Enumeration gadget 0 Step 5
  #Button0
  #button4
EndEnumeration

Define.l Event, GEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  
  For Gadget = #Button0 To #Button4
    y+25
    ButtonGadget(Gadget, 10, y, 80, 20, "Button "+Str(Gadget))
  Next
EndProcedure

Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Debug "Vous avez cliqué sur " + GetGadgetText(Gevent)    
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Je me suis servi de cette astuce suggérée par G-Rom dans un jeu que j'ai posté sur ce forum.

Sur ce principe j'ai repris le code qui a servi à créer le tien. Le code de création des gadgets est plus court.

Code : Tout sélectionner

Enumeration Inter 0 Step 9
  #inter0
  #inter9
EndEnumeration

Enumeration Texte 10 Step 9
  #Texte0
  #Texte9
EndEnumeration

; PB internes Zeug
Structure PB_GadgetVT
   GadgetType.l
   SizeOf.l
   GadgetCallback.i
   FreeGadget.i
   GetGadgetState.i
   SetGadgetState.i
EndStructure

ImportC "" 
   PB_Event_AddWithData(a,b,c,d,e,f)   
EndImport

; Eigene Nachrichten
#CHANGESTATE    = #WM_USER
#GETSTATE       = #WM_USER + 1
#SETSTATE       = #WM_USER + 2

Structure mygadget
   Gadget.i
   OldProc.i
   State.i   
EndStructure

Procedure VT__GetGadgetState(*Gadget.integer)
   ProcedureReturn SendMessage_(*Gadget\i, #GETSTATE, 0, 0)
EndProcedure

Procedure VT__SetGadgetState(*Gadget.integer, state)   
   SendMessage_(*Gadget\i, #SETSTATE, 0, state)   
EndProcedure

Procedure mygadgetProc(hWnd, Msg, wParam, lParam)
   Protected *mg.mygadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
   Protected x , y, color, hdc, rect.rect
   Protected Proc
   
   proc = *mg\OldProc
   
   If Msg = #WM_PAINT
      
      hdc = StartDrawing(CanvasOutput(*mg\Gadget))
         
         If *mg\State = 0            
            color = $7779E9
         Else
            color = $9CE3AA
         EndIf
         
         Box(0, 0, GadgetWidth(*mg\Gadget), GadgetHeight(*mg\Gadget), color)
         
         rect\right = GadgetWidth(*mg\Gadget) 
         rect\bottom = GadgetHeight(*mg\Gadget) 
         
         DrawEdge_(hdc, rect, #BDR_SUNKENINNER, #BF_RECT)
         
         If *mg\State = 0
            rect\right = GadgetWidth(*mg\Gadget)    / 2            
         Else
            rect\left  = GadgetWidth(*mg\Gadget)  / 2      
            rect\right = GadgetWidth(*mg\Gadget)    / 2 + rect\left         
         EndIf
         
         rect\left    + 1
         rect\top       = 1
         rect\bottom - 1
         
         DrawFrameControl_(hdc, rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)         
         
      StopDrawing()
   EndIf
   
   If Msg = #GETSTATE
      ProcedureReturn *mg\State
   EndIf
   
   If Msg = #SETSTATE
      *mg\State = lparam
      SendMessage_(hWnd, #WM_PAINT, 0, 0)   
   EndIf   
   
   If Msg = #WM_LBUTTONUP      
      *mg\State ! 1      
      PB_Event_AddWithData($332C, *mg\Gadget, 0, #PB_EventType_Change, 0, 0)      
      SendMessage_(hWnd, #WM_PAINT, 0, 0)      
   EndIf      
   
   If Msg = #WM_DESTROY
      SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
      FreeMemory(*mg)
   EndIf
   
   ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure


Procedure MyGadget(id, x, y, width, height)
   
   Protected gadget
   Protected *mg.mygadget
   Protected *vt.PB_GadgetVT
   
   *mg = AllocateMemory(SizeOf(mygadget))
   
   gadget = CanvasGadget(id, x, y, width, height, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
   
   If id = #PB_Any
      *mg\Gadget = gadget
   Else
      *mg\Gadget = id
   EndIf   
   
   ;Gadget Daten im Gadget speichern
   SetWindowLongPtr_(GadgetID(*mg\Gadget), #GWLP_USERDATA, *mg)
   
   ;Callback umbiegen 
   *mg\OldProc = SetWindowLongPtr_(GadgetID(*mg\Gadget), #GWLP_WNDPROC, @mygadgetProc())
   
   ;setzen von GetGadgetState und SetGadgetState
   *vt = PeekI(IsGadget(*mg\Gadget) + SizeOf(Integer))
   
   *vt\GetGadgetState    = @VT__GetGadgetState()   
   *vt\SetGadgetState    = @VT__SetGadgetState()
   
   ProcedureReturn gadget
EndProcedure

Procedure main()
   
   Protected window
   Protected gadget
   Protected event
     
   window = OpenWindow(#PB_Any, 0, 0, 300, 280, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)   
   
   x=10
   
   For gadget = #inter0 To #inter9
     If gadget = 5
       x = 100 
       y = 0
     EndIf
     
     y+20
          
     MyGadget(Gadget, x, y, 35, 18)
     TextGadget(Gadget+10, x+50, y, 20, 20, "OFF")
   Next
   
   SetGadgetState(0, 1)
   
   Repeat
     event = WaitWindowEvent()
     gevent = EventGadget()
     tevent = EventType()
     
     Select event
       Case #PB_Event_CloseWindow
         Break
           
       Case #PB_Event_Gadget
         If tevent = #PB_EventType_Change
           If GetGadgetState(gevent)
             SetGadgetText(gevent+10, "ON")  
           Else
             SetGadgetText(gevent+10, "OFF")  
           EndIf         
         EndIf        
      EndSelect      
   ForEver
EndProcedure:End main()