en supprimant le gadget image
et en dessinant directos sur la fenetre
et en redessinant l'image dans une callback
cela ne fait plus de trace

, mais les petits navions clignotent...
je suppose qu'il faudrait placer le redessin des pitits navion également dans la callback....
Code : Tout sélectionner
;; Sujet:
;; ------
;; Glissement de champs.
;; Cet exemple présente comment gérer le Glissement d'icones sur une image
;; de fond.
;; Les événements souris sont gérés par la fonction Evenement.
;; Une procédure WLangage "Glisse" est utilisée pour contrôler Les champ à
;; glisser et la surface autorisée lors du Glissement.
;; pour intégrer Cet exemple dans votre fenêtre:
;; 1. Copiez la variable composée publique "Glisser" dans le code
;; d'initialisation de votre fenêtre
;; 2. Copiez Les trois lignes d'initialisation des événements.
;; 3. Modifiez la liste des champs "glissant" de la procédure Glisse.
;; Note: la surface de Glissement est délimitée par le champ image "FOND".
;; Ce champ peut contenir ou non un fichier image (.BMP ou autre).
Structure stru_glisser
InitX.w ;; position X souris initiale
InitY.w ;; position Y souris initiale
PosX.w ;; position cadre haut gauche
PosY.w ;; position cadre haut gauche
id.l
champ.s ;; Nom du champ déplacé
EndStructure
Enumeration
#window
#FOND
#AVION1
#AVION2
#AVION3
#Img_fond
#img_avion
EndEnumeration
;; Initialisation de la procédure de gestion d'événement
;Evénement("Glisse","",513) ;;513=WM_LBUTTONDOWN=bouton gauche enfoncé
;Evénement("Glisse","*.",512) ;;512=WM_MOUSEMOVE=déplacement souris
;Evénement("Glisse","*.",514) ;;514=WM_LBUTTONUP=bouton gauche relâché
Procedure WindowCallback(WindowID, Message, lParam, wParam)
If Message = #WM_PAINT
If StartDrawing(WindowOutput(#window))
DrawImage(ImageID(#Img_fond),0,0)
StopDrawing()
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure glisse()
NumEVE.w ;; Numéro de l'événement à traiter
PosX.w: PosY.w ;; Nouvelle position des champs
MemoEtat.w ;; Etat de l'objet
glisser.stru_glisser
If OpenWindow(#window,0,0,627,394,#PB_Window_SystemMenu,"Glissement d'objet")
If CreateGadgetList(WindowID(#window))
If LoadImage(#img_avion, "AVION.bmp")
ImageGadget(#AVION1,154,107,29,24,ImageID(#img_avion))
ImageGadget(#AVION2,353,76,29,24,ImageID(#img_avion))
ImageGadget(#AVION3,192,266,29,24,ImageID(#img_avion))
EndIf
; If LoadImage(#Img_fond, "carte.bmp")
; ImageGadget(#FOND,0,0,619,363,ImageID(#Img_fond))
; EndIf
LoadImage(#Img_fond, "carte.bmp")
EndIf
If StartDrawing(WindowOutput(#window))
DrawImage(ImageID(#Img_fond),0,0)
StopDrawing()
EndIf
SetWindowCallback(@WindowCallback())
Repeat
NumEVE=WaitWindowEvent() ;; récupère le n° de l'événement à traiter
Select NumEVE
Case #PB_Event_Gadget
Select EventGadget()
Case #AVION1
glisser\Champ ="Avion1"
;; Mémorise la position initiale de la souris
glisser\InitX = WindowMouseX(#window) ;; position X de la souris
glisser\InitY = WindowMouseY(#window) ;; position Y de la souris
glisser\PosX = glisser\InitX ;; Posit initiale X du champ
glisser\PosY = glisser\InitY ;; Posit initiale Y du champ
glisser\id = #AVION1
Case #AVION2
glisser\Champ ="Avion2"
;; Mémorise la position initiale de la souris
glisser\InitX = WindowMouseX(#window) ;; position X de la souris
glisser\InitY = WindowMouseY(#window) ;; position Y de la souris
glisser\PosX = glisser\InitX ;; Posit initiale X du champ
glisser\PosY = glisser\InitY ;; Posit initiale Y du champ
glisser\id = #AVION2
Case #AVION3
glisser\Champ ="Avion3"
;; Mémorise la position initiale de la souris
glisser\InitX = WindowMouseX(#window) ;; position X de la souris
glisser\InitY = WindowMouseY(#window) ;; position Y de la souris
glisser\PosX = glisser\InitX ;; Posit initiale X du champ
glisser\PosY = glisser\InitY ;; Posit initiale Y du champ
glisser\id = #AVION3
EndSelect
Case 512 ;; WM_MOUSEMOVE=déplacement souris
If glisser\Champ<>"" ;; vérifie SI un Glissement est en cours
;; Calcule Les nouvelles coordonnées de l'objet
PosX=glisser\PosX+(WindowMouseX(#window)-glisser\InitX)
PosY=glisser\PosY+(WindowMouseY(#window)-glisser\InitY)
;; vérifie si le champ est toujours sur l'image FOND
If PosX<0
PosX=0
Else
If PosX>WindowWidth(#window)
PosX=WindowWidth(#window)
EndIf
EndIf
If PosY<0
PosY=0
Else
If PosY>WindowHeight(#window)
PosY=WindowHeight(#window)
EndIf
EndIf
ResizeGadget(glisser\id,PosX,PosY,-1,-1)
EndIf
Case 514
If glisser\Champ<>""
ResizeGadget(glisser\id,PosX,PosY,-1,-1)
glisser\id=-1
glisser\Champ=""
EndIf
Case #WM_PAINT
SetGadgetState(#AVION1,ImageID(#img_avion))
SetGadgetState(#AVION2,ImageID(#img_avion))
SetGadgetState(#AVION3,ImageID(#img_avion))
EndSelect
Until NumEVE = #PB_Event_CloseWindow
EndIf
EndProcedure
glisse()
²