What's the story behind the WM_SYNCPAINT message?
Danail wants to know the story behind the
The documentation pretty much tells the story. When a window has been hidden, shown, moved or sized, the system may determine that it needs to send a
WM_SYNCPAINT message to the windows of other threads. This message must be passed to
DefWindowProc, which will send the
WM_ERASEBKGND messages to the window as necessary.
When you call the
SetWindowPos function, the window manager updates the window size, position, whatever, and then it goes around repainting the windows that were affected by the operation. By default, the
SetWindowPos function does a quick-repaint of the windows before returning. After the function returns, the normal
WM_PAINT message does the real work of painting the window. The quick-repaint is done so that there is immediate feedback that the window did change its size, position, whatever.
This quick-repaint is done by sending a
WM_ERASEBKGND message to the windows that were affected by the
SetWindowPos operation. This normally happens without incident, but if one of the windows affected by the
SetWindowPos operation belongs to another thread, the window manager needs to get into the context of that other thread to finish the job. That’s where
WM_SYNCPAINT comes in. The
WM_SYNCPAINT message means, “Hey, I was going around quick-painting a bunch of windows, but I couldn’t quick-paint you (or any other windows on your thread) because I was on the wrong thread. Could you finish quick-painting yourself (and all the other windows that need quick-painting)? Thanks.”
Another way of looking at this is that it is a way for the window manager to teleport itself into another thread so it can finish its work. “Lah di dah, quick-painting all the windows, oh crap, I can’t quick-paint that window because it’s on the wrong thread. Let me inject myself into that other process [trivial, since I’m the window manager, I’M IN YR PROCESS REEDING YR MSGS], and now I can send a message to myself [
WM_SYNCPAINT], and when that other copy of me receives it, he’ll finish where I left off.”
If you don’t like any of this teleportation or multiple-copies-of-yourself imagery, you can say that the
WM_SYNCPAINT message means, “Quick-paint this window as part of a quick-paint operation begun on another thread.”
If you don’t want this quick-paint to take place, you can follow the instructions in the documentation and pass the
SWP_DEFERERASE flag to suppress the