How do I force windows NOT to redraw anything in my dialog when the user is resizing my dialog?
You can't prevent painting during resizing, but you can (with care) prevent repainting which is where flicker comes from. first, the bitblt.
There a two ways to stop the bitblt thing.
If you own the class of the top level window, then just register it with the CS_HREDRAW | CS_VREDRAW
styles. This will cause a resize of your window to invalidate the entire client area, rather than trying to guess which bits are not going to change and bitblting.
If you don't own the class, but do have the ability to control message handling (true for most dialog boxes). The default processing of WM_NCCALCSIZE
is where the class styles CS_HREDRAW
and CS_VREDRAW
are handled, The default behavior is to return WVR_HREDRAW | WVR_VREDRAW
from processing WM_NCCALCSIZE
when the class has CS_HREDRAW | CS_VREDRAW
.
So if you can intercept WM_NCCALCSIZE
, you can force the return of these values after calling DefWindowProc
to do the other normal processing.
You can listen to WM_ENTERSIZEMOVE
and WM_EXITSIZEMOVE
to know when resizing of your window starts and stops, and use that to temporarily disable or modify the way your drawing and/or layout code works to minimize the flashing. What exactly you want to do to modify this code will depend on what your normal code normally does in WM_SIZE
WM_PAINT
and WM_ERASEBKGND
.
When you paint the background of your dialog box, you need to not paint behind any of the child windows. making sure that the dialog has WS_CLIPCHILDREN
solves this, so you have this handled already.
When you do move the child windows, Make sure that you use BeginDeferWindowPos
/ EndDefwindowPos
so that all of the repainting happens at once. Otherwise you will get a bunch of flashing as each window redraws their nonclient area on each SetWindowPos
call.
If I understood the question properly, it's exactly the question Raymond addressed today.