Force an area of a Window to Repaint

This sample shows how to force an area of a window to repaint. Sometimes this is necessary, particularly when you're experimenting with owner draw control techniques, or when using the LockWindowUpdate API call to improve the speed at which a control fills with data.

Create a new project, add a module and paste in the code below:

Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
Private Type POINTAPI 
    X As Long 
    Y As Long 
End Type 
Private Declare Function GetWindowRect Lib "user32" ( _
    ByVal hWnd As Long, lpRect As RECT) As Long 
Private Declare Function GetClientRect Lib "user32" ( _
    ByVal hWnd As Long, lpRect As RECT) As Long 
Private Declare Function InvalidateRect Lib "user32" ( _
    ByVal hWnd As Long, lpRect As RECT, ByVal bErase As Long) As Long 
Private Declare Function ScreenToClient Lib "user32" ( _
    ByVal hWnd As Long, lpPoint As POINTAPI) As Long 

Public Sub RepaintWindow( _ 
        ByRef objThis As Object, _ 
        Optional ByVal bClientAreaOnly As Boolean = True _ 
    ) 
Dim tR As RECT 
Dim tP As POINTAPI 
    If (bClientAreaOnly) Then 
        GetClientRect objThis.hWnd, tR 
    Else 
        GetWindowRect objThis.hWnd, tR 
        tP.X = tR.Left: tP.Y = tR.Top 
        ScreenToClient objThis.hWnd, tP 
        tR.Left = tP.X: tR.Top = tP.Y 
        tP.X = tR.Right: tP.Y = tR.Bottom 
        ScreenToClient objThis.hWnd, tP 
        tR.Right = tP.X: tR.Bottom = tP.Y 
    End If 
    InvalidateRect objThis.hWnd, tR, 1 
    
End Sub 

To try out the redrawing, add a ListBox and a Command button to your Project's form. Make the ListBox as big as possible so you will see the effect. Then add the following code:

Private Sub Command1_Click() 
    RepaintWindow List1 
End Sub 

Private Sub Form_Load() 
Dim i As Long 
    For i = 1 To 200 
        List1.AddItem "TestItem " & i 
    Next i 
End Sub 

When you click on the button, the client area of the List Box will be entirely redrawn. The effect is not particularly noticeable with the List Box as shown, but basically this tip is here to get you around any problems you have when things don't redraw themselves properly.