Dessiner en C# [Résolu]

Signaler
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
1 mars 2008
-
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
1 mars 2008
-
Bonjour,
Je débute en C# et j'essaie de dessiner en WinForm.

Si je fais un MaForm.CreateGraphics(), le dessin que je mets dessus est très volatile ; il suffit que je passe une autre fenêtre en avant plan et je n'est plus rien de ce qui était dessiné et je ne peux plus dessiner dessus.

Si je dessine dans un BMP, je n'aurais le résultat qu'à la fin et pas tout au long du processus de dessin

Bitmap bmp =
new
Bitmap(
this.ClientRectangle.Width,
this.ClientRectangle.Height);g =

Graphics.FromImage(bmp);

//dessiner icipictureBox1.Image = bmp;

Comment faire ? Autre précision, je ne peut pas m'insérer dans un évènement Paint, le redessin serait trop long.

4 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
49
Salut,
Possibilité de passer par l'event paint mais en précisant que le Control doit utiliser un buffer (voire du côté de la méthode SetStyle).

<hr />
-My Blog-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Salut,

"Autre précision, je ne peut pas m'insérer dans un évènement Paint, le redessin serait trop long."

Bien sûr que non.. à moins de devoir dessiner à plus de 30 frames par secondes, dans ce cas tourne toi vers DirectX ou XNA.

Les dessins GDI+ ne sont pas persistants, tu dois donc redessiner à chaque évènement Paint. Normalement on utilse très peu CreateGraphics, quand tu as besoin de redessiner ta forme, exécute la méthode Invalidate( ) qui elle va déclencher l'évènement Paint.

Et comme le dit Bidou pour améliorer tout ça on utilise un double buffer, soit géré par la forme elle même via la méthode SetStyle soit avec un simple bitmap que tu gardes en mémoire.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Tiens, regardes comme c'est rapide :

public partial class Form1 : Form
{
    Rectangle[ ] rects = new Rectangle[ 200 ];
    int index = 0;


    public Form1( )
    {
        InitializeComponent( );


        this.Size = new Size( 800, 600 );
        Cursor.Hide( );
        this.BackColor = Color.Black;
        this.SetStyle( ControlStyles.UserPaint |
            ControlStyles.AllPaintingInWmPaint |
                ControlStyles.OptimizedDoubleBuffer, true );


        this.MouseMove += delegate( object sd, MouseEventArgs args )
        {
            if ( index < 200 )
            {
                rects[ index++ ] = new Rectangle( args.X, args.Y, 24, 24 );
                Invalidate( this.ClientRectangle );
            }
            else
            {
                index = 0;
            }
        };


        this.Paint += delegate( object sd, PaintEventArgs args )
        {
            Graphics g = args.Graphics;
            g.DrawRectangles( Pens.Turquoise, rects );
        };
    }
}
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
1 mars 2008

Je mets le temps à répondre.

Merci pour vos réponses ; ça m'a bien aidé. En effet, redessiner toute la fenêtre est très rapide. En fait, je crée un bitmap, d'où je tire un graphics pour dessiner dessus. Puis dans l'évènement Paint, je fais un : e.Graphics.DrawImage(_bmp, 0, 0);.

Je vais déposer le résultat sous le nom Laby.