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 :

OnPaint fait scintiller les objets


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut OnPaint fait scintiller les objets
    Bonjour,

    Je travail présentement sur un petit logiciel de dessin. Le logiciel charge des polygones, lignes et points qui se trouve dans un fichier pour les afficher dans un contrôle de type PANEL. Lorsque la fenêtre subi une transformation oubien si elle est minimisez et agrandit, tout les éléments sont rechargés à chaque fois ce qui cause des scintillement et je vois mes éléments apparaitre un a un. De plus, j'ai fais une petite fonction qui permet à l'utilisateur de faire une sélection en traçant un rectangle à l'aide de la souris et cela n'arrange pas les choses puisqu'à chaque déplacement de la souris, la fenêtre subit un refresh ce qui cause le re-déssinage de tout les éléments (Il peut avoir plus de 3000 objets déssiné sur la carte...)

    S'il serait possible que les polygones, lignes et points chargé reste afficher sans scintillement ça serait génial.

    Voici le code:

    Dans ma fonction qui ajoute les éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                Dim l_obj_graphicPath As GraphicsPath
     
                For Each l_obj_point As Point In p_obj_Record.Points
                    l_obj_graphicPath = New GraphicsPath
     
                    l_obj_graphicPath.AddEllipse(l_obj_Point.X, l_obj_Point.Y, 10, 10)
                    GraphicsList.Add(l_obj_graphicPath)
                Next
    Dans l'évènement Paint du PANEL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Private Sub pnlCarte_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pnlCarte.Paint
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias
     
            Dim l_obj_linearBrush As LinearGradientBrush
     
            For Each l_obj_graphPath As GraphicsPath In ShapeFile.GraphicsList
                e.Graphics.DrawPath(Pens.Black, l_obj_graphPath)
                l_obj_linearBrush = New LinearGradientBrush(l_obj_graphPath.GetBounds, Color.Beige, Color.OliveDrab, LinearGradientMode.ForwardDiagonal)
     
                e.Graphics.FillPath(l_obj_linearBrush, l_obj_graphPath)
                l_obj_linearBrush.Dispose()
            Next
        End Sub
    Merci beaucoup pour l'aide.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    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 204
    Par défaut
    System.Drawing.BufferedGraphics


    pour faire un peu plus long, ca déssine sur un buffer et non sur l'objet directement
    quand t'as fini, tu fais .render et ca scintille plus
    (rien n'empeche de garder le meme traitement dans onpaint, vu que le bufferedgraphics utilise aussi un objet graphics, enfin donc faire render sur l'objet graphics de l'evenement par exemple)

    tu peux avoir plusieurs bufferedgraphics qui se dessinent les uns sur les autres, ca peut surement gagner un peu de temps si t'as reellement plein de choses à dessiner
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Merci,

    Je vais essayer de trouver de la documentation sur bufferedgraphics. J'avais oublier de mettre le code pour le dessin du rectangle de sélection.

    À cause du me.refresh, tout ce qui à dans le PANEL scintille à fond, c'est gênant...

    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
        Private Sub pnlCarte_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pnlCarte.MouseMove
            Me.Refresh()
     
            If e.Button = Windows.Forms.MouseButtons.Left Then
                Dim l_obj_graphRectangle As Graphics = pnlCarte.CreateGraphics()
     
                Using l_obj_graphRectangle
                    Dim ux As Integer
                    Dim lx As Integer
                    Dim uy As Integer
                    Dim ly As Integer
     
                    If g_obj_locationPoint.X > e.X Then
                        ux = g_obj_locationPoint.X
                        lx = e.X
                    Else
                        ux = e.X
                        lx = g_obj_locationPoint.X
                    End If
                    If g_obj_locationPoint.Y > e.Y Then
                        uy = g_obj_locationPoint.Y
                        ly = e.Y
                    Else
                        uy = e.Y
                        ly = g_obj_locationPoint.Y
                    End If
     
                    Dim l_obj_rectangle As New Rectangle(lx, ly, ux - lx, uy - ly)
                    l_obj_graphRectangle.FillRectangle(New SolidBrush(Color.FromArgb(120, 173, 216, 230)), l_obj_rectangle)
                    l_obj_graphRectangle.DrawRectangle(Pens.Navy, l_obj_rectangle)
                End Using
            End If
        End Sub

  4. #4
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    En passant, si tu peux, passe à WPF avec lequel tout ces problémes de rendus sont définitivement résolus.

    Cdt.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    J'aimerais bien m'avancer avec le WPF, mais seulement j'aimerais une solution fonctionnant aussi bien pour le framework que le compact framework. Les classes du WPF sont inexistante dans la version compact framework

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 47
    Par défaut
    Suite aux événements, je suis dans le dessin d'un cadre de sélection utilisant l'objet BufferedGraphics

    Ce qui ce passe c'est que j'ai un dessin en dessous du cadre de sélection qui est en train de ce faire. Lorsque je clique et bouge la souris, le dessin du dessous disparait avec la couleur que je met dans g_obj_bufferSelection.Graphics.Clear(Color.White) si je remplace par color.transparent, j'obtiens un grand carré noir.

    Comment puis-je faire pour que lorsque l'utilisateur trace son carré de sélection, tout ce qui est en dessous reste dessiner et de plus, le carré de sélection doit être d'une couleur transparente.

    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
        Private Sub pnlCarte_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pnlCarte.MouseMove
            If e.Button = Windows.Forms.MouseButtons.Left Then
                g_obj_bufferSelection = BufferedGraphicsManager.Current.Allocate(pnlCarte.CreateGraphics, pnlCarte.DisplayRectangle)
                g_obj_bufferSelection.Graphics.Clear(Color.White)
     
                Dim ux As Integer
                Dim lx As Integer
                Dim uy As Integer
                Dim ly As Integer
     
                If g_obj_locationPoint.X > e.X Then
                    ux = g_obj_locationPoint.X
                    lx = e.X
                Else
                    ux = e.X
                    lx = g_obj_locationPoint.X
                End If
                If g_obj_locationPoint.Y > e.Y Then
                    uy = g_obj_locationPoint.Y
                    ly = e.Y
                Else
                    uy = e.Y
                    ly = g_obj_locationPoint.Y
                End If
     
                Dim l_obj_rectangle As New Rectangle(lx, ly, ux - lx, uy - ly)
     
                g_obj_bufferSelection.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(120, 173, 216, 230)), l_obj_rectangle)
                g_obj_bufferSelection.Graphics.DrawRectangle(Pens.Navy, l_obj_rectangle)
                g_obj_bufferSelection.Render()
                g_obj_bufferSelection.Dispose()
            End If
        End Sub

    Merci beaucoup.

Discussions similaires

  1. Réponses: 16
    Dernier message: 06/06/2007, 12h42
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. Architecture pour les objets d'un jeu
    Par Freakazoid dans le forum DirectX
    Réponses: 7
    Dernier message: 31/07/2004, 13h09
  4. Réponses: 5
    Dernier message: 07/07/2004, 15h13
  5. Rafraichissement de la fiche ainsi que de tous les objets
    Par portu dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/01/2004, 00h25

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