Dessiner en C#

Résolu
D_E_R_I_C Messages postés 4 Date d'inscription jeudi 26 juillet 2007 Statut Membre Dernière intervention 1 mars 2008 - 17 févr. 2008 à 08:57
D_E_R_I_C Messages postés 4 Date d'inscription jeudi 26 juillet 2007 Statut Membre 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.

4 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
17 févr. 2008 à 21:43
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-
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
18 févr. 2008 à 02:10
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
18 févr. 2008 à 02:38
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 );
        };
    }
}
3
D_E_R_I_C Messages postés 4 Date d'inscription jeudi 26 juillet 2007 Statut Membre Dernière intervention 1 mars 2008
1 mars 2008 à 22:00
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.
0
Rejoignez-nous