Accélération de la vitesse d'affichage en "gelant" le rafraîchissement d'un contrôle

Description

Généralement, lorsqu'on ajoute beaucoup d'éléments à une liste à l'aide d'une boucle et qu'on utilise DoEvents, il se produit un effet de clignotement
de la liste (à moins qu'on n'ait masqué celle-ci).

La source que je vous propose fait appel à 2 API qui permettent de "geler" et "dégeler" le rafraîchissement de cette liste ce qui accélère également le remplissage de la liste en question (voir le screenchot pour comparer l'ajout de 1000 éléments dans une ListView en utilisant les deux méthodes).

Les API en question sont InvalidateRect() et ValidateRect()

Source / Exemple :


'API pour mesurer le temps écoulé
Private Declare Function GetTickCount Lib "kernel32" () As Long

'API permettant de "geler" la mise à jour d'un objet
Private Declare Sub InvalidateRect Lib "user32" (ByVal hWnd As Long, ByVal t As Long, ByVal bErase As Long)
Private Declare Sub ValidateRect Lib "user32" (ByVal hWnd As Long, ByVal t As Long)
'   1000 éléments sont ajoutés à la ListView via une boucle rendant régulièrement la main à Windows
'   mais ici, on utilise 2 API permettant de "geler" et "dégeler" le rafraîchissement de la liste.
'   La liste "clignote" moins voire pas du tout si on annule la ligne (=>)

Private Sub Command2_Click()
    
    Dim nStart As Long
    Dim i As Integer
    
    nStart = GetTickCount()
    ListView1.View = 3
    
    ListView1.ListItems.Clear
        
    For i = 1 To 1000
        ListView1.ListItems.Add , , "Chaîne " & CStr(i)
            
        '-- En validant la région, il n'y aura pas de génération d'un message WM_PAINT
        ValidateRect ListView1.hWnd, 0&
            
        '-- "Rafraîchit" la liste
'(=>) Essayez également en désactivant cette ligne...
        If (i Mod 10) = 0 Then InvalidateRect ListView1.hWnd, 0&, 0&
            
        '-- Autorise le multi-tâche
        DoEvents
    Next i
    
    InvalidateRect ListView1.hWnd, 0&, 0&
    MsgBox Str(GetTickCount() - nStart) & " ms", vbOKOnly, "Avec optimisation :"

End Sub

Conclusion :


'============================
PS: Encore une source qui n'est pas de moi mais... vous connaissez la chanson...

Cette source est extraite d'un article de Xavier LECLERCQ consacré à l'optimisation du code en VB paru dans la revue "Programmez!" du mois de Novembe 2000 (n° 26)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.