IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Utilisation Double Buffering?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut Utilisation Double Buffering?
    Bonjour,

    Je suis actuellement entrain de développer un outil de traçage de courbes. Le tracé de la courbe s'effectue sur un panel inséré dans le Form. L'utilisateur a la possibilité de definir un rectangle sur le panel dans lequel il peut zoomer. Lorsqu'il zoom de cette manière, un rectangle est dessiné par dessus la courbe (comme sous paint quand on dessine un carré ). Et c'est là qu'intervient le problème. Même en faisant en sorte que seul le rectangle soit "invalidé", il se produit un scintillement de l'image très pénible. J'ai vu qu'il fallait avoir recours au double buffering mais en appliquant ce que j'ai pu trouver sur le double buffering, je ne parviens pas à enlever ce scintillement.

    Le problème vient surtout que la methode paint du panel est appelée à chaque fois que la souris bouge (pour tracer le rectangle).

    Est ce qu'il y aurait une solution?

    Voila comment fonctionne mon code (les commentaires correspondent à ce que j'ai essayé de faire pour enlever ce scintillement):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    public ChartWindow() //ça c'est le form
    		{
    			InitializeComponent();
     
    			this.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint |
    				ControlStyles.UserPaint | ControlStyles.DoubleBuffer,true);
     
    		}
     
    private void panel1_Paint(Object sender, PaintEventArgs e) //ça c'est le
    		{
     
    			Pen pn = new Pen(Color.Blue, axeSize);
    			Point Origin = new Point(this.panel1.Left, this.panel1.Top);
    			Graphics g = e.Graphics;
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    			/*Bitmap drawing = null;
    			drawing = new Bitmap(this.panel1.Width, this.panel1.Height, e.Graphics);
    			Graphics g = Graphics.FromImage(drawing);*/
    			//g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
     
                            /*****Méthodes permettant de tracer le graphique *****/
    			_charts[0].setSize(this.panel1.Width-1, this.panel1.Height-1);
    			_charts[0].setChartArea(this.panel1.Region);
    			drawChart(_charts[0], g);
                            /*******************************************/
     
                            /*if (forceRedraw)
    			{
    				Bitmap bitmapTemp = new Bitmap(this.ClientSize.Width,
    					this.ClientSize.Height);
    				using (Graphics g2 = Graphics.FromImage(bitmapTemp))
    				{
    					drawChart(_charts[0], g2, this.panel1.Width-1, this.panel1.Height-1);
    					forceRedraw = false;
    				}
    				e.Graphics.DrawImage(bitmapTemp, 0,0);
    				bitmapTemp.Dispose();
    				bitmapTemp = null;
    			}
    			g.Clear(this.BackColor);
    			forceRedraw = false;*/
     
    			if (bIsZoomActive) //variable permettant de savoir si l'on est entrain de tracer le fameux rectangle
    			{
    				int xmin, ymin, xmax, ymax;
    				if (mouseDownPosition.X < mousePosition.X)
    				{
                                            // variables globales instanciées dans les mouse events
    					xmin = mouseDownPosition.X;
    					xmax = mousePosition.X;
    				}
    				else
    				{
    					xmin = mousePosition.X;
    					xmax = mouseDownPosition.X;
    				}
     
    				if (mouseDownPosition.Y < mousePosition.Y)
    				{
    					ymin = mouseDownPosition.Y;
    					ymax = mousePosition.Y;
    				}
    				else
    				{
    					ymin = mousePosition.Y;
    					ymax = mouseDownPosition.Y;
    				}
    				g.DrawRectangle(pn, xmin, ymin, xmax-xmin, ymax-ymin);
    			}
    			/*e.Graphics.DrawImageUnscaled(drawing, 0, 0);
    			g.Dispose();*/
    		}
    Désolé pour la longueur du post

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Si ce que tu appelles scintillement et ce que j'appellerais du rammage (jolie sais même pas si cela existe , Ha si la fontaine l'utilise dans une de ses falbes ), alors tu ne peut rien faire en conservant cette méthode.

    Je pense que le repaint constant du au mouvement de la souris consomme beaucoup de ressources.

    Peut être plutot que de faire cela peux tu changer l'aspect du pointeur de la souris, lui donnant la forme d'un carré ?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    pour avoir fait le meme mecanisme sur un picturebox (pour croper une image), normalement en doublebuffered, ca ne clignote pas.

    Je soupconne ton DrawChart. Il doit recalculer tout le graphique à chaque fois, d'ou le manque de perf. Peut etre que tu pourrais conserver le graphique comme une image pendant les phases de selection pour eviter une reconstruction permanente ?

    NB : ceci bien sur dans l'hypothese ou drawchart reconstruit bien à chaque fois le graphe.

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Il n'existe pas un système de calque ? Comme sous paint shop pro.
    Pour éviter de tout redessiner et juste dessiner dans un calque courant transparent ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    Salut

    Alors déjà, une bonne nouvelle, vous avez tous a peu près raison

    Je soupconne ton DrawChart. Il doit recalculer tout le graphique à chaque fois, d'ou le manque de perf. Peut etre que tu pourrais conserver le graphique comme une image pendant les phases de selection pour eviter une reconstruction permanente ?
    Ce n'est pas faux mais je n'ai pas trouvé d'autre solution (j'ai en effet donné la possibilité aux utilisateurs de pouvoir déplacer le graphique dans la fenêtre - très utile lors d'un zoom - mais ça nécessite de recalculer le graphique...)

    Si ce que tu appelles scintillement et ce que j'appellerais du rammage
    joli terme (et c'est d'ailleurs très probable )

    Pour éviter de tout redessiner et juste dessiner dans un calque courant transparent
    Alors j'ai un peu regardé ça et effectivment il doit y avoir moyen de faire comme ça. Je me plonge dedans et je vous dis si ça marche

    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    Tu pourrais toujours t'inspirer du code de Paint.Net qui doit etre en libre
    acces si ma mémoire est bonne..

    Comme cela, tu verras comment est gérée la transparence dans ce logiciel .Net

    The Monz, Toulouse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/11/2010, 09h40
  2. Utiliser le double buffering hardware
    Par ilias20 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 12/06/2010, 23h50
  3. Je n'arrive pas à utiliser le Double buffering
    Par Yann39 dans le forum AWT/Swing
    Réponses: 43
    Dernier message: 21/01/2007, 22h14
  4. Réponses: 7
    Dernier message: 03/08/2004, 16h33
  5. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo