A custom control I am creating needs to draw many “items” in its client space. A call to Invalidate() would trigger a new paint cycle wherein all items would be redrawn.
Now when there are many items and a lot of navigation happens within the control, things need to be optimized; so I need to trigger a paint cycle where only one or two items are drawn. I store references to these items so that the paint method (OnPaint) knows it’s a “quicky”.
The difficulty is that when OnPaint is executed, it is hard to know if other Invalidate() calls have been made in the meantime. In that case it should do a “normal”, complete paint.
I do make use of the clip rectangle. Of course I could check if the clip rectangle in OnPaint has become the whole of the client rectangle, a sign that Invalidate() was called, but this is not 100% safe. I thought of other similar solutions but they seem hacky.
What is the way this problem is usually, or best, solved?
The solution here would be to employ a double buffering approach with the BufferedGraphics class. This way you won’t have so much tricky stuff going on in your OnPaint and you’ll be able to paint whenever, whatever.
MSDN: Double Buffered Graphics (under “Manually Managing Buffered Graphics”)
Here’s a useful example:
Custom Drawing Controls in C# – Manual Double Buffering