Dessiner en C# [Résolu]

D_E_R_I_C 4 Messages postés jeudi 26 juillet 2007Date d'inscription 1 mars 2008 Dernière intervention - 17 févr. 2008 à 08:57 - Dernière réponse : D_E_R_I_C 4 Messages postés jeudi 26 juillet 2007Date d'inscription 1 mars 2008 Dernière intervention
- 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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 17 févr. 2008 à 21:43
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-

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 18 févr. 2008 à 02:10
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.

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Lutinore
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 18 févr. 2008 à 02:38
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 );
        };
    }
}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

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