[timage.canvas]problème de rafraichissement

Soyez le premier à donner votre avis sur cette source.

Vue 5 314 fois - Téléchargée 428 fois

Description

Ce code utilisse un canvas de type Timage.
Il trace un petit tableau de 13x13 cases.

Il me l'affiche en 1/2s, et pendant l'execution, la moindre opération su le canvas (par exemple rajouter un petit carré) réinitialise complement l'affichage du canvas, soit 0.5s pour chaque opération. (le canvas s'efface puis se recrée par un balayage de gauche a droite).

Sachant que je souhaite utiliser un timer pour faire une opération toutes les demi seconde c'est très génant, et je n'arrive pas a trouver de solution a mon problème. Quelqu'un peut-il m'éclaircir? Ou m'apporter une solution alternative pour éviter ces problèmes de rafraichissement..

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
15 janvier 2021

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.
Messages postés
5
Date d'inscription
lundi 8 décembre 2003
Statut
Membre
Dernière intervention
28 décembre 2003

Voila j'ai résolu mon problème très simplement: J'ai remplacé mon Timage par un Tpaintbox, l'affichage est instantané :D
Messages postés
5
Date d'inscription
lundi 8 décembre 2003
Statut
Membre
Dernière intervention
28 décembre 2003

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)."
Messages postés
15
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
10 décembre 2007

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 :-(
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
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

Tu vas voir la différence ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (MacaDaMsDamien)