Windows – How to avoid flicker while handling WM_ERASEBKGND in Windows dialog

dialogflickergdi+resizewindows

I have a dialog that resizes. It also has a custom background which I paint in response to a WM_ERASEBKGND call (currently a simple call to FillSolidRect).

When the dialog is resized, there is tremendous flickering going on. To try and reduce the flickering I enumerate all child windows and add them to the clipping region. That seems to help a little — now the flickering is mostly evident in all of the child controls as they repaint.

How can I make the dialog flicker-free while resizing? I suspect double-buffering must play a part, but I'm not sure how to do that with a dialog with child controls (without making all child controls owner-draw or something like that).

I should note that I'm using C++ (not .NET), and MFC, although pure Win32-based solutions are welcomed πŸ™‚

NOTE: One thing I tried but which didn't work (not sure why) was:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

Best Answer

Assuming that "FillSolidRect" is the erase of your background then return TRUE from the WM_ERASEBKGND.

To do the double buffering that you are almost doing in your code fragment, you will need to use CreateCompatibleBitmap and select that into your memDC.