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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, ToolWin;
type
TForm1 = class(TForm)
Timer1: TTimer;
PaintBox1: TPaintBox;
StatusBar1: TStatusBar;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Déclarations privées }
x,FPScount,lastT,T,oldT,nbframes,Tvrai,v,dim:integer;
treel:extended;
bmp:Tbitmap;
procedure statut;
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=false;
oldT:=gettickcount;
doublebuffered:=true; //pour les affichages successifs dans la statusbar
bmp:=Tbitmap.Create;
bmp.PixelFormat:=pf32bit;
statusbar1.panels[0].Width:=clientwidth div 2;
v:=200;//vitesse 200 pixels/s
timer1.Enabled:=true;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
dim:=paintbox1.ClientWidth div 5;
with bmp do
begin
width:=paintbox1.ClientWidth;
height:=paintbox1.ClientHeight;
end;
timer1.Interval:=30;//si on agrandit la fiche, de manière à recaler le fps>60 Hz
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
if assigned(bmp) then paintbox1.canvas.draw(0,0,bmp);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if x>=paintbox1.clientwidth-dim then treel:=0;
with bmp.Canvas do
begin
brush.Color:=clblack;
fillrect(paintbox1.clientrect);
brush.Color:=clred;
fillrect(rect(x,dim,x+dim,2*dim));
end;
paintbox1.Invalidate;//appel onpaint(affichage du buffer) évite proc anime(c'est un choix...)
//calcul FPS
T:=gettickcount;
treel:=treel+(T-oldT)/1000;//pour avoir le temps réel
x:=round(v*treel);
oldT:=T;
inc(fpscount);
if(T-lastT)>=1000 then
begin
Tvrai:=T-lastT;//si T-lastT est un peu supérieur à 1 s pour calculer la fréquence d'affichage plus précisément
nbframes:=fpscount;
lastT:=gettickcount;
if nbframes/(Tvrai*0.001)<60 then timer1.Interval:=timer1.Interval-1; //de manière à caler la fréquence réelle d'affichage à 60 Hz
fpscount:=0;
statut;//affichage statusbar le doublebuffered évite les scintillements
end;
end;
procedure TForm1.statut;
begin
statusbar1.Panels[0].Text:='f= '+format('%.2f',[1000/timer1.Interval])+' Hz';
statusbar1.Panels[1].Text:='FPS = '+format('%.2f',[nbframes/(Tvrai*0.001)])+ ' images/s (Hz)';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bmp.Free;
end;
end. |
Partager