Est-il possible avec Purebasic de créer un button toggle de ce type:

Merci à tous ...
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 10, 200, 20, "Bouton à bascule1")
ButtonGadget(1, 10, 40, 200, 20, "Bouton à bascule2")
ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)
SetGadgetState(4, #True)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code : Tout sélectionner
;Interupteur.pbi
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_LBUTTONDBLCLK;#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
Code : Tout sélectionner
XIncludeFile "Interrupteur.pbi"
;***TEST***
#NbrInter = 10
Enumeration Fenetre
#Fenetre_principale
EndEnumeration
Enumeration Gadgets
#Inter_0
#Inter_1
#Inter_2
#Inter_3
#Inter_4
#Inter_5
#Inter_6
#Inter_7
#Inter_8
#Inter_9
#Txt_0
#Txt_1
#Txt_2
#Txt_3
#Txt_4
#Txt_5
#Txt_6
#Txt_7
#Txt_8
#Txt_9
#TxtInfo
EndEnumeration
Macro MonInter(NumInter, X ,Y)
MonGadget(NumInter, X, Y, largeurInter, HauteurInter)
EndMacro
Macro MonTexte(IdGadget, NumInter)
TextGadget(IdGadget, GadgetX(NumInter)+LargeurInter + 20, HauteurInter / 4 + GadgetY(NumInter), 30, 20, "")
EndMacro
Procedure Ouvrir_Fenetre_principale()
Protected gadget
Protected event
Protected.i LargeurInter = 70, HauteurInter = 40
OpenWindow(#Fenetre_principale, 0, 0, 280, 280, "Interrupteurs", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
MonInter(#Inter_0, 10, 10)
MonInter(#Inter_1, 10, GadgetY(#Inter_0) + GadgetHeight(#Inter_0) + 10)
MonInter(#Inter_2, 10, GadgetY(#Inter_1) + GadgetHeight(#Inter_1) + 10)
MonInter(#Inter_3, 10, GadgetY(#Inter_2) + GadgetHeight(#Inter_2) + 10)
MonInter(#Inter_4, 10, GadgetY(#Inter_3) + GadgetHeight(#Inter_3) + 10)
MonInter(#Inter_5, GadgetX(#Inter_0) + 130, GadgetY(#Inter_0))
MonInter(#Inter_6, GadgetX(#Inter_1) + 130, GadgetY(#Inter_1))
MonInter(#Inter_7, GadgetX(#Inter_2) + 130, GadgetY(#Inter_2))
MonInter(#Inter_8, GadgetX(#Inter_3) + 130, GadgetY(#Inter_3))
MonInter(#Inter_9, GadgetX(#Inter_4) + 130, GadgetY(#Inter_4))
MonTexte(#Txt_0, #Inter_0)
MonTexte(#Txt_1, #Inter_1)
MonTexte(#Txt_2, #Inter_2)
MonTexte(#Txt_3, #Inter_3)
MonTexte(#Txt_4, #Inter_4)
Montexte(#Txt_5, #Inter_5)
Montexte(#Txt_6, #Inter_6)
Montexte(#Txt_7, #Inter_7)
Montexte(#Txt_8, #Inter_8)
Montexte(#Txt_9, #Inter_9)
TextGadget(#TxtInfo, 10, 260, 260, 15, "Double-cliquer pour changer l'état d'un interrupteur")
SetGadgetState(#Inter_0, #False)
SetGadgetState(#Inter_1, #True)
SetGadgetState(#Inter_2, #True)
SetGadgetState(#Inter_3, #False)
SetGadgetState(#Inter_4, #True)
SetGadgetState(#Inter_5, #True)
SetGadgetState(#Inter_6, #False)
SetGadgetState(#Inter_7, #False)
SetGadgetState(#Inter_8, #True)
SetGadgetState(#Inter_9, #False)
For i = 0 To 9
If GetGadgetState(i) = #True
SetGadgetText(i+10, "Ouvert")
Else
SetGadgetText(i+10, "Fermé")
EndIf
Next i
Repeat
event = WaitWindowEvent()
If event = #PB_Event_CloseWindow
Break
EndIf
If event = #PB_Event_Gadget
If EventType() = #PB_EventType_Change
Select EventGadget()
Case #Inter_0 To #NbrInter
If GetGadgetState(EventGadget())
SetGadgetText(EventGadget() + 10, "Ouvert")
Else
SetGadgetText(EventGadget() + 10, "Fermé")
EndIf
EndSelect
EndIf
EndIf
ForEver
EndProcedure
Ouvrir_Fenetre_principale()