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

Windows Forms Discussion :

[C#] Comment Obtenir un Refresh sans "scintillements&a


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut [C#] Comment Obtenir un Refresh sans "scintillements&a
    Bonjour,

    Je me suis défini un control qui réprésente une zone de trace (un graphique) qui se met a jour de façon asynchrone sur reception d'une nouvelle mesure...

    (Une mesure dans mon cas correspond a un tableau de 40valeurs correspondants a la couleur du pixel pour chaque ordonnée)

    En gros a chaque fois que je recois une mesure (correspondant donc a une abscisse), je rafraichi le control pour afficher cette mesure..

    Mon problème est qu'au plus je recois de mesures au plus il y a de pixels a affichés.
    Au départ, a l'oeil nu, le rafraichissement n'est pas génant car on voit juste une mesure apparaitre a droite des autres...

    Par contre quand j'ai beaucoup de mesures, le temps qu'il redessine les mesures a chaque Refresh fait que je vois mon graphique se remplir de gauche a droite...
    (comme il recoit plusieurs mesures a la seconde, a force le graphique entier "scintille")

    Je pense qu'il est possible de travailler sur le graphics puis d'afficher visuellement les modifs d'un coup mais je ne sais pas comment...

    En pseudo code je voudrais savoir s'il existe pas un truc du genre :

    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
     
    protected override void OnPaint(PaintEventArgs e)
    {
         Brush brush = new SolidBrush(Color.Red);
     
        // Les modifications serotn mis en "pile"
        e.graphics.METTRE_EN_PAUSE();
     
        // Le rectangle n'est pas affiché tout de suite
        e.Graphics.FillRectangle(brush, new Rectangle(0,0,10,10));
     
        // Le rectangle n'est pas affiché tout de suite
        e.Graphics.FillRectangle(brush, new Rectangle(0,0,10,10));
     
       ........
     
       for(int i= 0 ; i < listesMesuresRecues.Count; i++)
       {
           // DESSINER LA MESURE
       }
       ........
     
        // le graphics trace tout d'un coup...
        e.graphics.FLUSH();
    }
    hum.. le pseudo code est un peu débile mais j'espère que vous aurez compris dans l'idée ce que je cherche a faire...

    Merci d'avance pour vos réponses.

    fd.

  2. #2
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    sous .Net2.0, il faut que tu crée un BufferedGraphics à partir de ton Graphics et que tu dessines dessus.

    si version antérieur du framework, il faut que tu dessines dans le graphics d'un bitmap invisible, et que dans le onpaint, tu dessines le bitmap dans le Graphics.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut
    Merci pour ta réponse.

    Effectivement j'avais songé a la solution du bitmap mais j'espérais trouver une solution du genre "BufferedGraphics "... Au vu de ta réponse pour le 1.1 c'est non...

    Rah, encore une fois je constate les apports de la 2.0 .....

    Bon comme moi je suis à la 1.1 , je vais de ce pas appliquer ta solution

    fd.

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    As-tu utiliser Invalidate au lieu de Refresh :

  5. #5
    Membre expérimenté Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Par défaut
    et encore mieux as tu pensé à ne raffraichir que les regions concernées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	Control.Invalidate(Region region)
    et essaies ceci sur le control dont tu as surchargé le onpaint
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	SetStyle(ControlStyles.DoubleBuffer, true);

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut
    Salut neguib,

    Si je ne me trompe pas Invalidate va me libérer uniquement la zone que je vais lui demander et donc je vais redessiner uniquement cette zone là, c'est bien ca?

    En fait moi j'utilise le refresh car en fonction du nombre de mesures reçues , mon echelle est récalculée et donc je dois tout reafficher le graphique (pour le cas ou il y a un changement d'echelle)

    De même les mesures affichés correspondent a des valeurs et chaque valeur est fonction d'un dégradé de couleur...

    Comme je peux égaleemtn paramètrer mon dégradé de couleurs (modifier l'echelle, les couleurs) je suis là aussi obligé de tout redessiner le graphique..

    En gros je ne peux pas me permettre de redessiner uniquement la mesure que je recois.

    Sinon Harry_polin là j'essai de passer par une bitmap mais je ne sais pas comment ecrire dans le graphics d'un bitmap ...

    Si tu pouvais me resneigner la dessus ca m'aiderai beaucoup

    Ps : Sinon j'ia d'autre solution comme mettre un control caché dans mon control, ecrire dans le control caché et reclaquer ca dans le graphics de mon control d'un trait.... mais ca me parait bien lourd comme solution..

  7. #7
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Méthode Graphics.FromImage
    pour recupérer le Graphics d'un Bitmap notamment

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut
    tsss.. je suis naze sur ce coup

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut
    Voilà j'ai codé la solution de Harry_polin, ca marche nickel

    Merci pour vos réponses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2013, 00h26
  2. Réponses: 6
    Dernier message: 26/04/2012, 07h42
  3. Réponses: 3
    Dernier message: 24/04/2012, 14h25
  4. Comment obtenir les sources de la bibliothèque sans installer le JDK?
    Par Bowser dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 31/05/2011, 14h54
  5. Réponses: 4
    Dernier message: 13/11/2007, 10h10

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