OVH Cloud OVH Cloud

Image en mouvement scintillante

13 réponses
Avatar
Sergio
Bonsoir,
j'ai mis une image Gif (mais le pb est le m=EAme avec une=20
image Bmp ou Jpeg) dans la propri=E9t=E9 Picture d'un=20
contr=F4le Image qui est en mouvement sur l'=E9cran gr=E2ce =E0=20
un contr=F4le Timer tous les 100 ms.=20
Or cette image lorsqu'elle est en mouvement, donne la=20
d=E9sagr=E9able impression de clignoter ou plut=F4t de=20
s'afficher avec un temps de retard par rapport au=20
Timer ... et bien s=FBr je veux garder un interval de 100=20
ms. Ce n'est pas trop g=E9nant pour le d=E9roulement du=20
programme ... mais =E7a fait pas propre !!
Quelqu'un aurait-il une solution pour =E9viter cela ?
Merci d'avance.
@ +

3 réponses

1 2
Avatar
ng
Oui en effet, je parlais pour du refresh direct sans back buffer, c'est pour
ça ;)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/



François Picalausa a écrit :

Hello,

Effectivement, mea culpa, il ne clignote pas.
C'est quand on update souvent le masque qu'il clignote...

Par contre, avec un backbuffer, sans autoredraw pour la surface de
destination, ça ne clignote pas non plus.
'Sur une form avec un picturebox pctBackBuffer
'Un timer1.interval = 1
'bitmap c:test.bmp
Option Explicit

Private PictureObject As Picture

Private Sub Form_Load()
Set PictureObject = LoadPicture("c:test.bmp")
Me.ScaleMode = 1
'Obligatoire sur le backbuffer pour voir qqch
pctBackBuffer.AutoRedraw = True
pctBackBuffer.Visible = False
End Sub

Private Sub Timer1_Timer()
Static X As Long

X = X - Screen.TwipsPerPixelX
If X < -PictureObject.Width Then X = Me.ScaleWidth

pctBackBuffer.PaintPicture PictureObject, X, 0
Set Me.Picture = pctBackBuffer.Image
pctBackBuffer.Cls
End Sub

Par contre, si tu le fais sans backbuffer, ça clignote...
Mais ça, avec ou sans autoredraw (si ce n'est qu'en autoredraw > true, ça ne se voit que sur les systèmes plus lents).


"ng" a écrit dans le message de
news:
Chez qui ca clignote ? ;)


Salut,

Je n'ai pas ce genre d'effets sans autoredraw=true.
Simplement, quand une form passe au dessus d'un autre, le contenu
est effacé


Ca se passe chez moi pour un fréquence de refresh elevée, l'effet de
scintillement n'est pas tout a fait le même qu'avec une ImageBox (là
apparaition de lignes horizontales...)

Mais avec cette technique par contre, j'ai du scintillement...


lol bah décidement...

je vais essayer de refaire des exemples pour voir ce qu'il en ait ;)


Hello,

Mais surtout, n'oublie pas de mettre en AutoRedraw=True, sinon tu
retrouveras certains effets désagréables de scintillement...



Je n'ai pas ce genre d'effets sans autoredraw=true.
Simplement, quand une form passe au dessus d'un autre, le contenu
est effacé

Sinon tu peux utiliser un UserControl (avec gestion de masque
pour la transparence...)



Propriétés MaskPicture, MaskColor, et BackStyle...
Mais avec cette technique par contre, j'ai du scintillement...








Avatar
Zoury
Salut Joe!

n'est-ce pas à 18/s que le cinéma tourne,



C'est 24 images par seconde.. ;O)
http://perso.club-internet.fr/daccart/tpe2003/rythme/page1.htm

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
L'exemple à François utilise un contrôle Timer tout comme toi.. Hors le
niveau de priorité du Timer est assez faible ce qui peut aussi causer un
décalage entre les appels de l'événement Click(). Pour obtenir une meilleure
précision, tu peux les APIs pour gérer le Timer.

Ex :
'***
' Form1
Option Explicit

Private Declare Function SetTimer _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long _
) As Long

Private Declare Function KillTimer _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long _
) As Long

Private Sub Form_Load()
' interval d'une seconde.. 1000 ms
Call SetTimer(Me.hwnd, 0, 1000, AddressOf TimerProc)
Me.Caption = "Timer Test"
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call KillTimer(Me.hwnd, 0)
End Sub
'***

'***
' Module1
Option Explicit

Public Sub TimerProc _
( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long _
)
' placer votre code ici..
Form1.Visible = Not Form1.Visible
End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
1 2