en fait le principe est assez simple
on est des programmeurs ?
bon programmons !
le but: ne pas dessiner sur le bouton ??? , et bien , une jolie condition , et voila :
note que la condition isole le bouton , donc marche aussi avec ton cercle qui defile ...
si tu avait plusieurs gadget, le principe est le meme , tu isoles chaque gadget par une condition..
c'est un peut complexe a coder, mais apres t'es tranquilles

remarque aussi que le fait d'avoir utilisé les fonction Gadgetx , GagdetWith() etc ... permet de modifier
la position ou la taille du gadget sans modifier la ligne concernant la condition
on pourrai en faire une procedure du coup

[reedit] code modifié dans ce sens
là on est pas dans l'ecran, donc faut tout gerer ..
exemple modifié pour montrer avec 2 boutons
Code : Tout sélectionner
;***********************************************
;Titre :*evite_gadget
;Auteur : Zorro
;Date :19/06/2016
;Heure :09:51:12
;Version Purebasic : PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
;***********************************************
enumeration
#win
#bouton
#bouton2
EndEnumeration
Declare Evite_gadget(num_gadget,x,y,taux)
InitSprite()
;Quant on clique sur le bouton ou que l'on ne fait rien, le crecle rouge se dessie dessus le bouton et non en dessous...
OpenWindow(#win,0,0,240,240,"Exemple de dessin sur la fenêtre",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#bouton,50,50,150,30," bouton 1")
ButtonGadget(#bouton2,10,150,150,30," bouton 2" )
Repeat
event=WaitWindowEvent(2)
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #bouton
Debug "bouton1 clické"
Case #bouton2
Debug "bouton2 clické"
EndSelect
Case #PB_Event_CloseWindow
end
EndSelect
color=rgb(random(255,50),random(255,50),random(255,50)) : xs=random(240,0) : ys=random(240,0)
if Evite_gadget(#bouton,xs,ys,8)=#true and Evite_gadget(#bouton2,xs,ys,8)
StartDrawing(windowOutput(#win))
Circle(xs,ys,10,color)
StopDrawing()
Endif
ForEver
Procedure Evite_gadget(num_gadget,x,y,taux)
; By Dobro
; renvoi True si les coordonées entrée sont en dehors de la position du gadget
;num_gadget = numero du gadget a surveiller
;x,y = coordonées entrées ,on teste si elle sont dans la zone du gadget, si oui renvoi #False
;taux = petite marge avant ou apres le gadget pour eloigner le dessins des bords du gadget
if (x<gadgetx(num_gadget)-taux or x>gadgetx(num_gadget)+GadgetWidth(num_gadget)+taux) or (y<gadgetY(num_gadget)-taux or y>gadgetY(num_gadget)+GadgetHeight(num_gadget)+taux) ; on protege le bouton
ProcedureReturn #True
Else
ProcedureReturn #false
Endif
EndProcedure
; Epb