Dessiner en C# [Résolu]

Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Dernière intervention
1 mars 2008
- - Dernière réponse : D_E_R_I_C
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Dernière intervention
1 mars 2008
- 1 mars 2008 à 22:00
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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
58
3
Merci
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-

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 108 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
35
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 108 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
35
3
Merci
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 );
        };
    }
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 108 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
4
Date d'inscription
jeudi 26 juillet 2007
Dernière intervention
1 mars 2008
0
Merci
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.
Commenter la réponse de D_E_R_I_C

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.