Le double buffering pr eliminer les lignes blanches qui apparaissent a lexecutio

Signaler
Messages postés
10
Date d'inscription
vendredi 22 août 2008
Statut
Membre
Dernière intervention
20 avril 2009
-
Messages postés
1
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
15 mai 2011
-
Slt,
j'ai un prob,cest que j'ai developper une petite application qui affiche un ballon qui se gonfle et qui se degonfle ds un intervalle de temps,j'ai remarqué qu'a lexcution ,l'image n'est pas pure,il ya des lignes blanches qui apparaissent et apres une recherche,il ya le principe du buffering qu'il faut inclure au code,mais toujours il faut le definir ds le la methode "paint",et le dessin devrait etre presque obligatoirement ds la mm methode!!
mais ds code,je sais pas comment faire ds mon cas,j'ai des fonction pr dessiner,j'ai essayé plusiers choses mais ca marche pas.
svp aidez moi pr ke je puisse avancer!
voila mon code:
using

System;
using

System.Collections.Generic;
using

System.ComponentModel;
using

System.Data;
using

System.Drawing;
using

System.Text;
using

System.Windows.Forms;
namespace

Ballon{

public
partial
class
Ballon :
Form{

//déclaration de la variable rayon

public
int rayon;

//création d'un objet de la classe abstraite Brush responsable

//du remlissage des formes (rectangle,ellipse...)

public
Brush couleur;

public Ballon(){

InitializeComponent();

rayon = 0;

//instanciation de la classe Timerx1 =

new
Timer();

//methode qui manipule l' evenement augmenter rayon. Se produit quand l'intervalle de temps s'est écouléx1.Tick +=

new
EventHandler(augmenterRayon);x1.Interval = 30;

//définit le temps entre deux evenementsx2 =

new
Timer();

// manipuler l' evenement d'abaissement du rayon à chaque interval de tempsx2.Tick +=

new
EventHandler(BaisserRayon);x2.Interval = 30;

//instanciation de la classe Brush à l'intermidiaire de la classe Brushes pour toutes les couleurs bleuescouleur =

Brushes.Blue;}

 

public
void augmenterRayon(
object sender, System.
EventArgs e){

Graphics g =
this.CreateGraphics();

if (rayon < ClientRectangle.Width / 2)
//si le rayon < au rayon de la fenêtre{

g.FillRectangle(

Brushes.White, ClientRectangle);
//colore la fenêtre en blanc

// fonction qui dessine un disque plein ,elle a 5 parametres : la couleur coordonnée du centre

// et les coord du rectangle à l'interieur duquel il y aurait le disqueg.FillEllipse(couleur, ClientRectangle.Width / 2 - rayon, ClientRectangle.Width / 2 - rayon, 2 * rayon, 2 * rayon);

//incrementation du rayonrayon++;

}

else
//si le rayon arrive au bord de la fenêtre client {

x2.Start();

//debut événememt baisser-rayon (degonfler)x1.Stop();

//arreter le gonflement }

}

public
void BaisserRayon(
object sender, System.
EventArgs e){

Graphics g =
this.CreateGraphics();g.FillRectangle(

Brushes.White, ClientRectangle);

if (rayon > 0){

g.FillRectangle(

Brushes.White, ClientRectangle);g.FillEllipse(couleur, ClientRectangle.Width / 2 - rayon, ClientRectangle.Width / 2 - rayon, 2 * rayon, 2 * rayon);

rayon--;

//decrementation du rayon}

else
//si le rayon est nul{

x1.Start();

//gonflement du ballonx2.Stop();

//degonflement du ballon }

}

 

public
static
void lanceBallon(
Ballon b){

b.x1.Start();

}

//génération d'évenement gonflement du ballon si on click sur l'element gonfler du menu action.

private
void gonflerToolStripMenuItem_Click(
object sender,
EventArgs e){

Graphics g =
this.CreateGraphics();
//objet de controle du grapheg.FillRectangle(

Brushes.White, ClientRectangle);x1.Start();

//debut d'evenement : gonfler (augmenter rayon)x2.Stop();

// arret d'evenement : degonfler (baisser rayon)}

//génération de l'évenement dégonflement du ballon si on click sur l'element dégonfler du menu actio

private
void degonflerToolStripMenuItem_Click(
object sender,
EventArgs e){

Graphics g =
this.CreateGraphics();g.FillRectangle(

Brushes.White, ClientRectangle);x2.Start();

x1.Stop();

}

private
void Ballon_Load(
object sender,
EventArgs e){

}

}

}

5 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Bonsoir,
Pour le double buffering, tu peux utiliser ceci:
this.SetStyle(<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

  ControlStyles.AllPaintingInWmPaint |

  ControlStyles.UserPaint |

  ControlStyles.DoubleBuffer,true);

<hr />
-My Blog-
Messages postés
10
Date d'inscription
vendredi 22 août 2008
Statut
Membre
Dernière intervention
20 avril 2009

slt,
oui mais le prob est je sais pas ou mettre les instructions:


Buffer = new
Bitmap(
this.Width,
this.Height);



Graphics
g =

Graphics
.FromImage(Buffer);






normalement c'est tjrs ds le paint mais moi,je dessine pas ds le paint,j'ai des fonctions pr dessiner(augmenterrayon..).et ou je peux appeler ces methodes pr lire a partir du buffer et le liberer. 

g.DrawImageUnscaled(Buffer, 0, 0);

g.Dispose();


 plz aidez moi.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Cette instruction est à mettre au niveau du constructeur.
Si tu ne dessines pas dans le paint, c'est probablement une erreur. Erreur qui pourrait expliquer pourquoi tu as des problemes d'affichage...

<hr />
-My Blog-
Messages postés
10
Date d'inscription
vendredi 22 août 2008
Statut
Membre
Dernière intervention
20 avril 2009

je dois ecrire tout mon code,dans le paint!!!!ta lu mon code!!!?
Messages postés
1
Date d'inscription
dimanche 1 mars 2009
Statut
Membre
Dernière intervention
15 mai 2011

//creation d'un tampon image en memoire
Bitmap bm = new Bitmap(Largeur, Hauteur);
//associer un Graphics à ce bitmap
Graphics gp = Graphics.FromImage(bm)
// Dessiner dans le graphics associé au bitmap
gp.FillRectangle(…)
//copier le bitmap dans le graphics Video
Graphics gvi = this.CreateGraphics();
Gvi.DrawImage(bm);