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

VB.NET Discussion :

probleme de scintillement (le retour!)


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Par défaut probleme de scintillement (le retour!)
    Bonjour,

    je suis de retour avec le problème de scintillement qui persiste.

    j'ai exposé mon problème la semaine dernière mais le message posté a disparu suite aux problèmes du serveur (j'avais aussi posté un message du même type en octobre). c'est pas grave, je vais réexpliquer.

    voilà, j'ai un Panel contenant une image (la carte du monde pour être exact). Dans ce panel, j'ai mis un PictureBox qui s'appelle "carte" pour me permettre de dessiner des courbes toutes simples par dessus la carte du monde. J'ai donc mis comme propriété du picturebox un fond transparent

    Les courbes en question sont en fait plein de petites lignes mises bout à bout, et varient au cours du temps : chacune de ces petites lignes se déplace de quelques pixels. Ce que je fais c'est un rafraichissement des courbes toutes les 5 ou 10 secondes par exemple.

    J'ai testé les réponses qui m'ont été proposées mais cela ne marche pas malheureusement...

    voici les éléments de code dédiés au tracé et au rafraichissement, tels que l'on m'a conseillé de le faire :

    tout d'abord le New :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            buffer = System.Drawing.BufferedGraphicsManager.Current.Allocate(carte.CreateGraphics, carte.ClientRectangle)
        End Sub
    puis carte_Paint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub carte_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles carte.Paint
            InvokePaintBackground(Me.carte, e)
        End Sub
    L'affichage de la courbe qui n'est exécuté que toutes les 5 secondes :
    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
     
        Public buffer As BufferedGraphics
        Sub affichage_courbe()
     
            Dim bsat0, bsat1, i, ils, lsat0, lsat1, lsat2, lsat3 As Integer
            Dim ligne() As String
     
            ' Lecture du fichier contenant les coordonnees
            Dim sr As New StreamReader(dir_out & "\coordonnees")
            ligne = Split(sr.ReadLine)
            lsat0 = Val(ligne(0))
            bsat0 = Val(ligne(1))
     
            For i = 1 To 360
                ligne = Split(sr.ReadLine)
                lsat1 = Val(ligne(0))
                bsat1 = Val(ligne(1))
                lsat2 = lsat0
                lsat3 = lsat1
     
                ' La carte du monde fait 800 x 400 pixels
                If Abs(lsat1 - lsat0) > 400 Then
                    ' Si on est au bord de la carte
                    If lsat1 > lsat0 Then lsat2 += 800 Else lsat3 += 800
                    ils = i
                End If
     
                With buffer.Graphics
                    .DrawLine(Pens.LightBlue, lsat2, bsat0, lsat3, bsat1)
     
                    If ils = i Then
                        lsat2 -= 800
                        lsat3 -= 800
                        .DrawLine(Pens.LightBlue, lsat2, bsat0, lsat3, bsat1)
                        ils = 0
                    End If
     
                    lsat0 = lsat1
                    bsat0 = bsat1
                End With
            Next
            buffer.Render()
     
            sr.Close()
        End Sub
    Le problème c'est que le fond du Picture Box "carte" est devenu opaque (on ne voit plus la carte du monde, ou alors il fait nuit partout sur Terre!!!) et la courbe n'est pas rafraichie : je veux dire par là que le tout premier tracé reste affiché et les suivants se superposent et se décalent petit à petit au cours du temps par rapport à ce premier tracé.

    Encore une fois merci pour votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    au début de ton dessin, tu peux faire buffer.graphics.clear(couleur) pour appliquer une couleur de fond

    et il faut surement déssiner ta carte en premier, buffer.graphics.drawimage()

    si ta carte est sur un control en dessous, il faut faire me.invokepaintbackground en spécifiant le graphics de ton buffer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Par défaut
    merci pour ta réponse

    j'ai essayé ce que tu as proposé mais les symptômes restent les mêmes : le fond du PictureBox qui au début est transparent devient opaque. La courbe est tracée mais pas rafraichie (le tout premier dessin reste affiché)

    est-ce que je m'y prends mal? (cf code donné plus haut)

    merci

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    il faut faire un render sur le graphics donné dans l'event paint, après avoir fait le invokepaintbackround sur le graphics du buffer

    c'est censé marché, t'es pas le premier à demander ca ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Par défaut
    merci de ton aide, mais je n'arrive pas à me dépatouiller avec ce pb : soit j'ai la carte sans courbe, soit la carte est opaque.

    je pense que je vais créer un projet simplifié contenant le problème de scintillement et je le mettrai en fichier joint (quand j'aurai le temps de le faire!)

    a+

  6. #6
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    J'ai un peu le même problème j'ai un picture box qui est en mouvement dans ma form qui elle a une image de fond mais dans mon picture box c'est une image .png avec un fond transparent et donc lors de certain mouvement de cette picturebox j'ai un trait blanc qui apparait mais disparait au prochaine tick de mon timer qui s'occupe de faire bouger ma picturebox.

    Et je ne trouve pas de solution non plus à mon souci
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    Citation Envoyé par Ogotcha Voir le message
    J'ai un peu le même problème j'ai un picture box qui est en mouvement dans ma form qui elle a une image de fond mais dans mon picture box c'est une image .png avec un fond transparent et donc lors de certain mouvement de cette picturebox j'ai un trait blanc qui apparait mais disparait au prochaine tick de mon timer qui s'occupe de faire bouger ma picturebox.

    Et je ne trouve pas de solution non plus à mon souci
    utilises tu un bufferedgraphics ?
    si non, je te conseille de tester
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Ah non j'utilise pas ce fameux bufferedgraphics il faut que je trouve une petite aide la dessus cela peut peut être résoudre mon problème
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    fait une recherche sur le forum, j'en parle souvent ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    ok ok mais sinon on peut utiliser bufferedgraphics juste pour une image et travaillé sur toute la form en graphique ? c'est a dire que la picturebox en question (qui bouge et me fait des "truc" blanc") je peux lui appliquer ce fameux bufferedgraphics ?

    PS : je cherche sur le forum...
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    au lieu de mettre en backgroundimage ton png, tu instancies un bufferedgraphics
    sur tonpicturebox.resize, tu allocates le bufferedgraphics
    sur tonpicturebox.paint, tu fait un invokepaintackground en fournissant tonbufferedgraphics.graphics, puis du fait tonbufferedgraphics.graphics.drawimage en fournissant ton image
    et tu fini par un render sur le graphics fournit en paramètre par l'event paint
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    oula c'est pas simple :

    voici ce que j'utilise pour afficher mon image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PictureBoxComp.Image = RecadrerImage(compg(0).compImg, New Rectangle(IMGX * compg(0).numeroMvt, IMGY * compg(0).direction, IMGX, IMGY))
            PictureBoxComp.Location = New Point(compg(0).X, compg(0).Y)
    Mon image et un image avec plusieurs vue c'est a dire qu'en fonction du de la direction le rectangle qui me recadre mon image n'est pas le même
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    on va commencer par le début, pourquoi fait tu bouger un picturebox et aussi bouger l'image qu'il y a dedans ???
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Afin que mon image bouge en fonction du temps et des différentes action du l'utilisateur.

    j'utilise donc une image avec différentes vu (sprite) en fonction de la direction que cette image prend ma picture box acueille mon image recadrer de manière à avoir la bonne image pour la bonne direction mais aussi en fonction du mvt précédent car pour chaque direction il y a plusieurs images

    [EDIT]
    En gros mon image c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     RecadrerImage(compg(0).compImg, New Rectangle(IMGX * compg(0).numeroMvt, IMGY * compg(0).direction, IMGX, IMGY))
    et les coordonées de ma picture box c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    New Point(compg(0).X, compg(0).Y)
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  15. #15
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Voici ce que je viens de tester avec le fameux bufferedgraphics :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            Dim buffer As BufferedGraphics
            Dim Context As BufferedGraphicsContext = BufferedGraphicsManager.Current
            Context.MaximumBuffer = PictureBoxComp.ClientSize
            buffer = Context.Allocate(PictureBoxComp.CreateGraphics, PictureBoxComp.ClientRectangle)
            ' Dessiner dans le buffer mon image recadrée
            buffer.Graphics.DrawImage(RecadrerImage(compg(0).compImg, New Rectangle(IMGX * compg(0).numeroMvt, IMGY * compg(0).direction, IMGX, IMGY)), 0, 0)
            Application.DoEvents()
            buffer.Render(PictureBoxComp.CreateGraphics)
    Alors conclusion de ce code : j'ai plus de transparence de mon image que je souhaitais afficher et mon image clignote a la vitesse d'intervalle de mon timer au lieu de resté afficher
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    le doevents ne sert à rien
    il faut monpicturebox.invokepaintbackground pour avoir la transparence (en donnant le graphics du buffer)
    il serait à mon avis plus aproprié de ne pas utiliser de picturebox mais de dessiner le buffer directement sur la fenetre
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Oui pourquoi pas mais comment ?
    Sinon pour ton monpicturebox.invokepaintbackground vb 2008 il ne me trouve pas j'ai monpicturebox.Invoke() mais pas de invokepaintbackground
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

  18. #18
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    (il doit falloir hériter pour avoir accès au invokepaintbackground ...)

    et bien avec un buffer aussi, tu créé ton buffer de la taille de ta fenetre, à chaque fois que tu dessines, tu fais un .clear puis tu dessines le fond de l'image sur le buffer avec drawimage et enfin tu dessines la portion d'image à ses coordonnées (vu qu'elle bouge)
    tu finis par un render

    sur l'evenement de paint de la fenetre, tu fais juste un render sur le graphics de l'evenement


    si c'est un jeu ou un truc dans le genre, directx ou xna seraient plus apropriés (ou peut etre wpf ...)
    les windowsforms ont des performances graphiques minables
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  19. #19
    Membre chevronné
    Avatar de Ogotcha
    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    c'est juste pour animation rapide rien de plus.
    le invokepaintbackground je vois a peut pret comment il fonctionne mais je n'y arrive pas pouff

    Bon je pense que je verrai ceci une fois l'appli quasi terminée car ce n'est pas hyper choquant....

    Tiens sinon une idée pour afficher une fenêtre de debug quand l'application est compilée ? par exemple je lance toto.exe en passant un argument /debug et hop un fenetre de debug s'affiche et l'application toto.exe tourne toujours ?
    Mon Blog
    FAQs DotNet
    Fonction utile : Recherche

Discussions similaires

  1. probleme de scintillation
    Par john stedd dans le forum VB.NET
    Réponses: 5
    Dernier message: 02/10/2007, 09h51
  2. [GIF] probleme de scintillement
    Par fantomasmusic dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 08/06/2007, 18h40
  3. RegExp : Problem avec ajout de retour a la ligne
    Par Roming22 dans le forum Linux
    Réponses: 3
    Dernier message: 12/01/2006, 19h44
  4. [Control] Problemes de scintillement sur control perso
    Par Clorish dans le forum Composants VCL
    Réponses: 4
    Dernier message: 07/07/2005, 14h55
  5. Réponses: 8
    Dernier message: 02/04/2004, 17h31

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