Invalidate marks the control (region, or rect) as in need of repainting, but
doesn't immediately repaint (the repaint is triggered when everything else has
been taken care of and the app becomes idle).
Update causes the control to immediately repaint if any portions have been
invalidated.
Refresh causes the control to invalidate, and then update (i.e. immediately
repaint itself).
Most of the time Invalidate is sufficient, and advisable as you can do a bunch
of invalidations (either explicit or implicit) and then let the control repaint
itself when the app is idle. It is advisable to use Update or Refresh when you
want the control to immediately repaint because the app will not be idle for a
user-noticable period of time.