Bonjour PhM,
Un Gif est un ensemble d'images assemblées en un seul fichier.
C'est le logiciel (visualiseur ou navigateur) qui assure l'animation.
Le gadget Image de PB n'affiche que des images fixes, c'est donc au programme de permuter ces images.
On utilise le timer pour changer l'image sans bloquer le reste du programme (ne pas utiliser Delay()!)
À noter que certains gif ont des délais différents pour chaque image (rare), mais heureusement PB sait gérer.
Exemple:
http://www.purearea.net/pb/CodeArchiv/G ... rprize.gif
Voici ce que cela donne avec ton code.
Code : Tout sélectionner
; Affichage d'un Gif animé en PureBasic
;
; Un fichier GIF est composé de plusieurs images
; Le délai d'affichage de chaque image peut être différent
;
; ImageFrameCount() = Nombre d'images dans le Gif
; SetImageFrame() = Avancer à l'image numéro ...
; GetImageFrameDelay() = Lire le délai d'affichage de l'image ...
EnableExplicit
UseGIFImageDecoder()
Enumeration
#Win
#Gad_Img
#Img
#Timer
EndEnumeration
OpenWindow(#Win, 0, 0, 250, 250, "CatchImage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CatchImage(#Img, ?Image_Start, ?Image_End - ?Image_Start)
ImageGadget(#Gad_Img, 70, 90, ImageWidth(#Img), ImageHeight(#Img), ImageID(#Img))
AddWindowTimer(#Win, #Timer, GetImageFrameDelay(#Img))
Define Frame ; Numéro de l'image en cours
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Timer
SetGadgetState(#Gad_Img, ImageID(#Img))
; Le délai entre chaque image n'est pas toujours identique
; on peut/doit donc relire et redéfinir ce delai
RemoveWindowTimer(#Win, #Timer)
AddWindowTimer(#Win, #Timer, GetImageFrameDelay(#Img))
; Avancer à l'image suivante
Frame + 1
; Boucler si on a atteint la dernière
If Frame >= ImageFrameCount(#Img) : Frame = 0 : EndIf
; Définir la nouvelle image en cours
SetImageFrame(#Img, Frame)
EndSelect
ForEver
End
DataSection
Image_Start:
IncludeBinary "F2_flash.gif"
Image_End:
EndDataSection

Attention à certains exemples sur les forums qui mettent
Frame + 1 avant le premier affichage, ce qui à pour effet de manquer la première image (qui commence à 0)
