cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 30 déc. 2003 à 13:49
une astuce simple :
Procedure Maform.paint;
begin
//travail dessins copies &co sur monbmp
bitblt(form1.canvas.handle,0,0, monbmp.canvas.handle,0,0,200,200,srccopy);
end;
Dans un timer faire:
Procedure Maform.OnTimer(sender:Tobject);
begin
SendMessage(Handle,wm_Paint,0,0)
end;
Et voila.... eventuelement devier WM_ERASEBKGND pour encore de meilleurs perfs...
Bon Coding...
ManChesTer.
MacaDaMsDamien
Messages postés5Date d'inscriptionlundi 8 décembre 2003StatutMembreDernière intervention28 décembre 2003 28 déc. 2003 à 01:27
Voila j'ai résolu mon problème très simplement: J'ai remplacé mon Timage par un Tpaintbox, l'affichage est instantané :D
MacaDaMsDamien
Messages postés5Date d'inscriptionlundi 8 décembre 2003StatutMembreDernière intervention28 décembre 2003 26 déc. 2003 à 16:23
Voici une réponse que j'ai obtenu (merci jmic):
"J'ai utilisé deux Canvas différents. Un qui correspond à ce qui est affiché, l'autre qui permet de travailler. C'est ça qui évite le clignottement.
Pour être complet, sur le problème de vitesse, j'ai utilisé une autre astuce, basée sur un 3ème Canvas.
Imaginons que l'on veuille faire le dessin d'une partie d'échec, avec le mouvement des pièces.
Le premier Canvas va contenir le "fond" qui n'est pas modifié (ou très peu), c'est-à-dire l'échiquier.
Le deuxième Canvas va être le canvas de travail vu précédemment,
Le troisième est celui qui est effectivement visible à l'écran.
Les manips sont les suivantes :
- Préparation une fois pour toute du canvas de fond.
A chaque itération
- Copie du 1er Canvas sur le deuxième.
- Ajout de la position des pièces sur le 2eme canvas
- Copie du 2eme canvas sur le 3eme.
Ca permet de gagner du temps (à chaque itération) si le dessin du fond est long à dessiner (c'était mon cas dans mon application)."
achtouf
Messages postés15Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention10 décembre 2007 25 déc. 2003 à 00:01
Salut
J'avais fait un petit jeu (Nibbles ou serpent) il y a quelques temps sous Delphi 4 en utilisant un composant TImage. Lors du passage à Delphi 7 je me suis redu compte que ca n'arrétait pas de scintiller meme avec DoubleBuffered. => Bug connu de Delphi4.
Il est recommander d'utiliser un composant TPaintBox qui ne pose pas le pb (je crois).
Je crois cependant qu'il est possible de surcharger une méthode pour empécher au TImage de se rafraichir comme ca. Mais je sais plus comment :-(
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 20 déc. 2003 à 15:05
Déjà, sans trop réfléchir, essaye donc ceci :
dans "procedure TForm1.FormActivate(Sender: TObject)"
tu ajoutes
Form1.DoubleBuffered := True; // voir aide en ligne de Delphi
30 déc. 2003 à 13:49
Procedure Maform.paint;
begin
//travail dessins copies &co sur monbmp
bitblt(form1.canvas.handle,0,0, monbmp.canvas.handle,0,0,200,200,srccopy);
end;
Dans un timer faire:
Procedure Maform.OnTimer(sender:Tobject);
begin
SendMessage(Handle,wm_Paint,0,0)
end;
Et voila.... eventuelement devier WM_ERASEBKGND pour encore de meilleurs perfs...
Bon Coding...
ManChesTer.
28 déc. 2003 à 01:27
26 déc. 2003 à 16:23
"J'ai utilisé deux Canvas différents. Un qui correspond à ce qui est affiché, l'autre qui permet de travailler. C'est ça qui évite le clignottement.
Pour être complet, sur le problème de vitesse, j'ai utilisé une autre astuce, basée sur un 3ème Canvas.
Imaginons que l'on veuille faire le dessin d'une partie d'échec, avec le mouvement des pièces.
Le premier Canvas va contenir le "fond" qui n'est pas modifié (ou très peu), c'est-à-dire l'échiquier.
Le deuxième Canvas va être le canvas de travail vu précédemment,
Le troisième est celui qui est effectivement visible à l'écran.
Les manips sont les suivantes :
- Préparation une fois pour toute du canvas de fond.
A chaque itération
- Copie du 1er Canvas sur le deuxième.
- Ajout de la position des pièces sur le 2eme canvas
- Copie du 2eme canvas sur le 3eme.
Ca permet de gagner du temps (à chaque itération) si le dessin du fond est long à dessiner (c'était mon cas dans mon application)."
25 déc. 2003 à 00:01
J'avais fait un petit jeu (Nibbles ou serpent) il y a quelques temps sous Delphi 4 en utilisant un composant TImage. Lors du passage à Delphi 7 je me suis redu compte que ca n'arrétait pas de scintiller meme avec DoubleBuffered. => Bug connu de Delphi4.
Il est recommander d'utiliser un composant TPaintBox qui ne pose pas le pb (je crois).
Je crois cependant qu'il est possible de surcharger une méthode pour empécher au TImage de se rafraichir comme ca. Mais je sais plus comment :-(
20 déc. 2003 à 15:05
dans "procedure TForm1.FormActivate(Sender: TObject)"
tu ajoutes
Form1.DoubleBuffered := True; // voir aide en ligne de Delphi
Tu vas voir la différence ;)