Comment faire un scroll de texte fluide à 100% qui ne saccade pas?
Quel Timer utiliser et quel composant graphique?
Comment faire un scroll de texte fluide à 100% qui ne saccade pas?
Quel Timer utiliser et quel composant graphique?
Bonjour,
Je dirais un TImage avec un dessin du texte par DraText ou TextOut. La propriétée DoubleBuffering doit être à true.
oui ou l'équivalent: incrémenter(x,y) d'un textout contenu dans le caneva d'un bitmap par un événement ontimer et faire un draw dans une paintbox sur la fiche . Utilise un intervalle timer assez court pour éviter le scintillement. principe d'une animation simple...
tiens, vite fait:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); private { Déclarations privées } y:integer; BITMAP:Tbitmap; public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin timer1.Interval:=10; bitmap:=Tbitmap.create; with bitmap do begin width:=Paintbox1.width; height:=paintbox1.Height; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin inc(y); bitmap.canvas.TextOut(100,y,'salut'); paintbox1.Canvas.Draw(0,0,bitmap); end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin paintbox1.Canvas.Draw(0,0,bitmap); end; end.
Ce que vous avez dit c juste mais sa saccade . Ce ke je veux faire c un scroll ki ne s'arrete jamais (comme les news bars de tv) c pas tellement facile ke vous croyez essayez et vous allez voir!
je pige pas... tu veux que ça tourne en boucles ? Pour cela, il suffit d'une condition sur y en fin de paintbox. explique. si c'est ça, c'est facile comme tout...
c pas sa !!!
Le probleme est le saccade.
Le rolling fait parfois des pauses de milli millisecondes mais tu les remarke avec les yeux . Il faut ke tu le voit 100% fluides pas de perturbation.
tu as compris?
ok, j'avais pas remarqué...----> graphics 32 pour ton animation.
ok g utilisé gr32 avec une timer directx est c bon mais le probleme que le scroll commence a saccadé aprés klk minutes.
Je doute kil ya un "reglage" dans le S.E windows ki force l'execution de l'application sans aucun interruption
oui, une petite fonction api serait la bienvenue...
ta pa une idée?
non désolé, tu as anticipé tout ce que ce que je pouvais proposer...
là, je vois pas. ceci dit dans les routines d'écran de veille, je me souviens de bout de code qui forçait l'application à faire des poses. donc le contraire doit être possible...
Bonjour,
un code qui fonctionne bien, avec peut-être parfois un petit flicker que je n'arrive pas à éliminer.
Dans la form timage1 est un enfant de Panel1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, OleCtrls, SHDocVw, Menus, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Panel1: TPanel; Image1: TImage; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } imagecount : integer ; procedure Drawimage(image:Timage;offset : integer); procedure InitImage(image:Timage); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Panel1.color:=clblack ; InitImage(image1) ; imagecount:=1 ; Timer1.Interval:=10 ; end; procedure TForm1.Timer1Timer(Sender: TObject); begin timer1.Enabled:=false ; inc(imagecount) ; drawimage(image1,imagecount) ; timer1.Enabled:=true ; end; procedure TForm1.Drawimage(image:Timage;offset : integer); var i : integer ; begin for i:=1 to 100 do image1.canvas.textout(100*i-offset,10,'<'+inttostr(i)+'>') ; end ; procedure TForm1.InitImage(image:Timage); begin image.Top:=0 ; Image.left:=0 ; image.Width:=clientwidth ; image.Height:=40 ; image.canvas.brush.color:=clblack ; image.canvas.font.color:=clred ; image.canvas.font.size:=14 ; image.canvas.font.name:='Arial' ; image.ControlStyle:=[] ; image.canvas.fillrect(rect(0,0,image1.width,image1.height)) ; end ; end. [/quote]
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
ya le compo TScrollingCredits de Raoul Snyman qui marche à merveille,
sinon ya aussi des compo dans la jvcl.
Rebonjour,
Pour éliminer le léger flicker, il suffit d'éxécuter à l'init l'instruction (merci à Caine )
Code : Sélectionner tout - Visualiser dans une fenêtre à part panel1.doublebuffered:=true ;
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson
et si je ne dessine pas sur un panel comment on fait?et en plus keske sa veut dire ce doublebuffered?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2panel1.doublebuffered:=true ;
dans mon code j'ai un pointeur qui designe un buffer a kel j'envoie mon scroll . ya ti une methode de faire le double buffering?
la méthode que je t'avais proposée te permet de dessiner dans un canvas virtuel celui d'un bitmap et d'afficher en une seule fois à l'aide du draw dans la paintbox. un buffer est une zone de mémoire tampon dédiée aux stockages de données en attente de traitement sur un périphérique.
ton bitmap là joue bien le rôle d'un buffer en ce sens qu'il stocke ton code de défilement du textout sans jamais effectuer les calculs de déplacement à l'affichage. tu bascules dans le réel uniquement sur le draw.
le doublebuffer à true fonctionne de la même manière, simplement tu n'as pas à créer ton buffer toi même.
J'ai conclus que la meilleur facon est de utiliser les composants gr32 mais reste un petit probleme: le faite de scroller une image de 300000*60 pixels provoke les scintillements
ya til une idée pr resoudre ce probleme?
eske win charge toute l'image au memoire?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager