Scintillement, event Paint [Résolu]

Signaler
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
-
cs_thebigboss
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
-
Bonjour,

j'étais sur que mon problème était super connu et j'ai cherché sur le forum, mais aucune des solutions proposées ne semblent marcher sur mon programme.

J'ai un panel qui contient une image de fond.
Sur l'event Paint de ce Panel, je dessine un rond :

void Pnl_JeuPaint(object sender, PaintEventArgs e)
{
//gr=e.Graphics;
//gr.FillEllipse(new SolidBrush(p.Color),pX,pY,pSize,pSize);
e.Graphics.FillEllipse(new SolidBrush(p.Color),pX,pY,pSize,pSize);
}


J'ai par ailleurs un Thread qui fait avancer mon rond:
private void ThreadMoveFunction()
{
int temps=10;//time in ms

while(pSpeed>0)
{
pX++;
pY++;

this.pnl_Jeu.Invalidate();
Thread.Sleep(temps);
pSpeed--;
}
}


Mon circle avant bien comme je le souhaite, mais le tout scintille.
En cherchant sur le forum j'ai trouvé des solutions en ajoutant des Style:
SetStyle(			System.Windows.Forms.ControlStyles.AllPaintingInWmPaint |			System.Windows.Forms.ControlStyles.UserPaint |			System.Windows.Forms.ControlStyles.DoubleBuffer, true);

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle( ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true );


Mais cela ne change absolument rien chez moi

J'avais l'impression qu'à chaque avancement de mon cercle, l'image de fond de mon Panel était redessinée, mais je l'ai supprimée et c'est pareil...

Merci d'avance.

Nico

A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!

5 réponses

Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
salut

paint directement ton panel dans un usercontrols

public class myPanel : UserControl
{

        public myPanel()
        {
            #region SetStyle

            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.Selectable, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.UserPaint, true);

            #endregion
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            //base.OnPaintBackground(e);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            //base.OnPaint(e);

            e.Graphics.FillEllipse(new SolidBrush(p.Color),pX,pY,pSize,pSize);
        }
}


ajout a cette class les propiété pX, pY,pSize en get , set;
dans ton thread de ta font tu modifie les valeur de ses propriétés
il tu l'invalide
muPael1.Invalidate();

la tu n'aura plus aucun sintillement
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
le soucis c que le panel est paint plusieur fois

1 fois sur le paintbackground
1 fois sur le paint

et une 3 eme fois sur ton event

hors avec ma methode

tu peux peindre tout en un seul appel

OnPaint

la tu peint ton background et ce que tu veux
Messages postés
380
Date d'inscription
samedi 22 janvier 2005
Statut
Membre
Dernière intervention
13 août 2011
7
s/font/Form/
:/

remarque 6 heures faudrait penser a se coucher
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Merci beaucoup pour ta réponse!!!

Je vais l'essayé tout de suite, par contre ce qui me semble surprenant c'est que pour ne pas avoir de scintillement lorsqu'on affiche un dessin dans un simple panel, il faille se créer un usercontrol???



A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!
Messages postés
216
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
12 avril 2017
2
Ta seconde réponse m'a fait me poser une bonne question "Est-ce que le problème serait identique avec un pictureBox?" et la réponse semble être non. Du coup j'ai préféré remplacer mon panel par un simple picturebox. Cela me semble plus simple que de ce créer un usercontrol et de lui passer en propriété tout ce qu'il doit afficher.

Merci pour ton aide!!!



A+

*******************************************
SharpDevelop est mon ami! CSharpFR.com aussi!!!!!!!!!