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 :

Appel multiple de la méthode Paint sur un panel [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Par défaut Appel multiple de la méthode Paint sur un panel
    Bonjour à tous et d'avance merci pour votre aide.
    Après trois jours de recherche un peu partout sur internet et, à moins que je n'ai vraiment pas de chance, je n'ai rien trouvé qui puisse m'aider.
    C'est pourquoi je fais appel à vous.

    Voici donc mon soucis.
    Pour la création d'un agenda professionnel, j'ajoute des panels (représentant mes rendez-vous) sur un panel de fond avec une grille horaire.
    Lors du scroll (par une scrollbar latérale indépendante), les rendez-vous sont correctement déplacés sur l'agenda mais ils clignotent beaucoup et très rapidement avant de se stabiliser.

    Après analyse au pas à pas, j'ai remarqué que la méthode paint de chaque panel de rendez-vous est parcourue plusieurs fois (entre 5 et 10 fois) pour rien. J'ai beau chercher, je ne trouve pas d'alternatives et je ne comprends pas pourquoi le programme repasse tous les rendez-vous en revue plusieurs fois lors de la mise à jour.

    Voici le code :
    Mes panels de rendez-vous sont créés dans un classe (RDV_Blocks) héritant de Panel. C'est dans la méthode onpaint de cette classe que je remplis les informations de chaque rendez-vous dans le 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
    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
     
        Protected Overrides Sub OnPaint(e As PaintEventArgs)
            MyBase.OnPaint(e)
            '---------------------
            'Créer le panel
            '---------------------
            If Not _RDV.SecondPosition Then
                Me.Location = New Point(dicEmployéPosition(_RDV.NomCourt_Employé), (dicHeuresVSMultiples(_RDV.HrDébut) - _ScrollValue) * 13)
            Else
                Me.Location = New Point(dicEmployéPosition(_RDV.NomCourt_Employé) + iJOURNALIER_LargeurColEmployé / 2,
                                        (dicHeuresVSMultiples(_RDV.HrDébut) - _ScrollValue) * 13)
            End If
            Me.Height = (dicHeuresVSMultiples(_RDV.HrFin) - dicHeuresVSMultiples(_RDV.HrDébut)) * 13
            If Not _RDV.DemiLargeur Then
                Me.Width = iJOURNALIER_LargeurColEmployé - 2
            Else
                Me.Width = iJOURNALIER_LargeurColEmployé / 2 - 2
            End If
            Me.BackColor = Color.Blue
     
            '-----------------------------
            'Ajouter les Textes en fonction de la hauteur du RDV
            '-----------------------------
            Dim lblSoins As Label = New Label
            Dim lblHeures As Label = New Label
            Dim lblClient As Label = New Label
            Dim lblCabine As Label = New Label
            Dim txtRemarque As TextBox = New TextBox
            Dim myBrush As SolidBrush = New SolidBrush(Color.White)
     
            If Me.Height < (5 + 10 + 5) Then
                'On n'affiche rien
            Else
                'Soin 
                e.Graphics.DrawString(_RDV.Soin, New Font("Arial", 12, FontStyle.Bold), myBrush, New Point(5, 5))
                If Me.Height < (5 + 10 + 5 + 20 + 5) Then
                    'On n'affiche pas les heures
                Else
                    'Heures
                    e.Graphics.DrawString(_RDV.Heures, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 25))
                    If Me.Height < (5 + 10 + 5 + 20 + 5 + 20 + 5) Then
                        'On n'affiche pas le client
                    Else
                        'Client
                        e.Graphics.DrawString(_RDV.Client, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 40))
                        If Me.Height < (5 + 10 + 5 + 20 + 5 + 20 + 5 + 20 + 5) Then
                            'on n'affiche pas la cabine
                        Else
                            'Cabine
                            e.Graphics.DrawString(_RDV.Cabine, New Font("Arial", 9, FontStyle.Regular), myBrush, New Point(5, 55))
                            If Me.Height < (150) Then
                                'On n'affiche pas la remarque
                            Else
                                'Remarque
                                txtRemarque.Multiline = True
                                txtRemarque.Location = New Point(5, 75)
                                txtRemarque.Height = 70
                                txtRemarque.Width = Me.Width - 10
                                txtRemarque.BackColor = Color.White
                                txtRemarque.Text = _RDV.Remarque
                                Me.Controls.Add(txtRemarque)
                            End If
                        End If
                    End If
                End If
            End If
            '-----------------------------
            'Ajouter la ligne de couleur
            '-----------------------------
            Dim pen As Pen = New Pen(Color.FromArgb(255, 255, 255), 5)
            pen.Color = _RDV.LightColor
            e.Graphics.DrawLine(pen, New Point(0, 0), New Point(0, Me.Height))
        End Sub
    Lors du scroll, je mets à jour la propriété ScrollValue de chaque élément (de RDV_Blocks) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Sub SCRL_RDV_VERTICAL_Scroll(sender As Object, e As ScrollEventArgs) Handles SCRL_RDV_VERTICAL.Scroll
            If pPreviousScrollPosition = SCRL_RDV_VERTICAL.Value Then Exit Sub 'pour éviter qu'il ne parcoure deux fois la Sub (une fois avec l'ancienne valeur et une fois avec la nouvelle)
            pPreviousScrollPosition = SCRL_RDV_VERTICAL.Value
     
            Me.SuspendLayout()
            For Each PanelElt As RDV_Blocks In dicRDVPanels 'dicRDVPanels est la liste (le dictionnaire) des rendez-vous créés.
                PanelElt.ScrollValue = SCRL_RDV_VERTICAL.Value
                PNL_FOND.Refresh()
            Next
            Me.ResumeLayout()
    End Sub

    Voilà, je pense que vous avez tous les éléments nécessaires. J'espère que vous pourrez m'aider.

    Merci beaucoup à tous.

    Mat

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Une erreur est de mettre de la logique dans la méthode OnPaint.

    Ici, on constate que vous créez des labels, textbox, etc... A chaque appel de OnPaint. Cela ne doit pas être le cas.
    Si vous devez arranger les composants en fonction de la taille de votre Panel, il vaut mieux utiliser la méthode OnResize pour savoir ce qui doit être affiché et où.

    La méthode OnPaint ne doit véritablement que dessiner. Dans la mesure où il y a des créations de composants, le comportement que vous observez n'est pas véritablement étonnant. Je ne dis pas que cela en est la cause, mais il y a de forte chance pour que cela soit le cas.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Par défaut
    Bonjour,

    merci beaucoup pour cette réponse rapide.

    J'ai testé et ça fonctionne parfaitement !!
    J'aurai encore appris quelque chose cette fois.

    Merci beaucoup.

    Juste une dernière question purement d'optimalisation.

    Est-il mieux de travailler avec les drawstring dans la méthode Paint et la textbox dans la méthode Resize ... ou ...
    Mettre toute la logique dans la méthode resize avec des Labels à la place de drawstring ?


    Le regroupement est plus logique (question de maintenabilité du code) mais est-ce que cela ne risque pas d'être plus lent avec les labels qu'avec drawstring ?
    Je fais appel à votre expérience et vos connaissances dans ce domaine.

    Merci d'avance.

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Mat_DubbleYou Voir le message
    Est-il mieux de travailler avec les drawstring dans la méthode Paint et la textbox dans la méthode Resize ... ou ...
    Mettre toute la logique dans la méthode resize avec des Labels à la place de drawstring ?
    Le comportement sera quasiment le même. Les label utilisent DrawString dans leur méthode OnPaint.

    Une autre possibilité, est de gérer la logique métier dans la méthode OnResize (texte à afficher, position) et à sauvegarder cela dans des variables, et de ne faire ensuite qu'un appel à DrawString dans la méthode OnPaint en se basant sur ces variables. Donc en gros faire la cascade de if d'un côté, et l'appel à DrawString de l'autre.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Par défaut
    Parfait, merci beaucoup.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2009, 13h54
  2. question sur la méthode paint()
    Par Invité dans le forum 2D
    Réponses: 8
    Dernier message: 30/11/2008, 12h18
  3. [script.aculo.us] Appel d'une méthode javascript sur le callback onUpdate
    Par thibane dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 02/04/2008, 11h33
  4. Réponses: 7
    Dernier message: 30/08/2007, 14h17
  5. controler l'appel de la méthode paint
    Par jdewalqu dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 21/08/2007, 08h09

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