Danail wants to know the story behind the WM_SYNCPAINT
message.
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_NCPAINT
and 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_NCPAINT
and 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 WM_SYNCPAINT
message.
0 comments