I have a main window with 3 child: hwndTocBox
(left panel), hwndSplitter
and hwndCanvas
(right panel).
hwndTocBox
has a child hwndTreeView
, which is a TreeView control. When I drag hwndSplitter
to the right (i.e want to make hwndTocBox
and hence hwndTreeView
bigger), the content (and background?) of hwndCanvas
and hwndSplitter
will remain for a while. (When I drag the splitter to the left, there is no problem at all.)
When hwndSplitter
is draged, it uses DeferWindowPos()
to resize and move hwndTocBox
, hwndSplitter
and hwndCanvas
. When hwndTocBox
is resized, in WM_SIZE
case of its windows procedure, it resizes hwndTreeView
(still using DeferWindowPos()
, since it resizes not only hwndTreeView
but also others).
I have tried to use CLIPCHILDREN
and WS_CLIPSIBLINGS
in several places, but it doesn't solve the problem.
Why the contents remain there for a while and erased later?
Could you indicate me how to solve this issue, please.
You'll need to repaint the portions of the window that you've resized, otherwise you'll get these strange artifacts. There's a reason they look like smears, because that's almost exactly what they are. A certain portion of the content was painted and appeared on screen normally. Then you resized the window. The portion that had already been painted was not repainted because you didn't invalidate it, but the newly-exposed portion had to be repainted because there was nothing there before.
The fix is simple: add a call to the InvalidateRect()
function at the bottom of your resizing code to ensure that the portion of the window you're resizing gets redrawn the next time that the window processes a WM_PAINT
message.
If you want to make sure that a WM_PAINT
message gets processed immediately (resulting in the immediate redrawing of your window's affected regions), follow up with a call to the UpdateWindow()
function. But this really shouldn't be necessary. It's much more efficient to postpone all of the redrawing to later when everything is finalized, rather than doing it incrementally. Relatively speaking, repainting a window is an expensive operation.