C'est tout simple, mais ça a l'avantage de ne pas utiliser l'api Window et de faire des boutons tout à fait personnalisés. A toi de modifier/améliorer selon ton usage
Code : Tout sélectionner
Structure bouton
pb_gadget.l
image.l
image_over.l
image_clic.l
image_inactif.l
etat.b
mode.b
EndStructure
Global NewMap kw_bouton.bouton()
Procedure kw_create_bouton(id_gadget,x,y,tx,ty,image,image_over,image_clic)
gadget = ImageGadget(id_gadget,x,y,tx,ty,ImageID(image))
If id_gadget = #PB_Any
id_gadget = gadget
EndIf
AddMapElement(kw_bouton(),Str(id_gadget))
kw_bouton()\etat = 1
kw_bouton()\image = image
kw_bouton()\image_over = image_over
kw_bouton()\image_clic = image_clic
kw_bouton()\image_inactif = image
kw_bouton()\pb_gadget = id_gadget
ProcedureReturn id_gadget
EndProcedure
Procedure kw_event_bouton()
retour = -1
If IsWindow(GetActiveWindow())
mx = WindowMouseX(GetActiveWindow())
my = WindowMouseY(GetActiveWindow())
ForEach kw_bouton()
If kw_bouton()\etat
a = Round((mx-GadgetX(kw_bouton()\pb_gadget))/GadgetWidth(kw_bouton()\pb_gadget),#PB_Round_Down)
b = Round((my-GadgetY(kw_bouton()\pb_gadget))/GadgetHeight(kw_bouton()\pb_gadget),#PB_Round_Down)
If Not a|b And kw_bouton()\mode = 0
kw_bouton()\mode = 1
SetGadgetState(kw_bouton()\pb_gadget,ImageID(kw_bouton()\image_over))
ElseIf a|b
kw_bouton()\mode = 0
SetGadgetState(kw_bouton()\pb_gadget,ImageID(kw_bouton()\image))
EndIf
If kw_bouton()\mode = 1 And EventType() = #PB_EventType_LeftClick
SetGadgetState(kw_bouton()\pb_gadget,ImageID(kw_bouton()\image_clic))
retour = kw_bouton()\pb_gadget
Delay(80)
SetGadgetState(kw_bouton()\pb_gadget,ImageID(kw_bouton()\image_over))
EndIf
EndIf
Next
EndIf
ProcedureReturn retour
EndProcedure
Procedure kw_enable_bouton(id_gadget,etat)
kw_bouton(Str(id_gadget))\etat = etat
If etat = 0
SetGadgetState(id_gadget,ImageID(kw_bouton(Str(id_gadget))\image_inactif))
EndIf
EndProcedure
Procedure kw_set_image_bouton(id_gadget,mode,image)
Select mode
Case 1
kw_bouton(Str(id_gadget))\image_over = image
Case 2
kw_bouton(Str(id_gadget))\image_clic = image
Case 3
kw_bouton(Str(id_gadget))\image_inactif = image
If kw_bouton(Str(id_gadget))\etat = 0
SetGadgetState(id_gadget,ImageID(kw_bouton(Str(id_gadget))\image_inactif))
EndIf
Default
kw_bouton(Str(id_gadget))\image = image
EndSelect
EndProcedure
CreateImage(1,168,35)
StartDrawing(ImageOutput(1))
Box(0,0,168,35,RGB(137, 172, 186))
StopDrawing()
If OpenWindow(0, 0, 0, 245, 105, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If LoadImage(0, "C:\Program Files\PureBasic\Examples\Sources\Data\purebasic.bmp") ; changez le 2ème paramètre en indiquant le chemin/fichier contenant votre image
kw_create_bouton(0,10,10,100,83,0,1,1) ;gadget,x,y,width,height,image,repos,image_survol,image_clic on pourrai rajouter directement l'image inactif au lieu de passer par setimage
kw_create_bouton(1,10,50,100,83,0,1,0)
EndIf
Repeat
Select kw_event_bouton()
Case 0
Debug "clic sur 0"
;kw_set_image_bouton(1,3,0)
Case 1
Debug "clic sur 1"
EndSelect
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf