There's a set of little known APIs that allow you to move multiple windows in one fell swoop, which can reduce flicker in contrast to moving each window individually. Using the APIs is fairly straight forward, but like many such APIs, they require you to use multiple steps. Forget a single step and things won't work as advertised.
C++ programmers use a technique known as "resource allocation is acquisition" to ensure that any "finalization" steps are not forgotten. Basically, the constructor sets things up and the destructor ensures the finalization occurs. The most widely known use of this technique is the
std::auto_ptr class, which ensures the pointer is deleted when the
auto_ptr leaves scope.
We can use this same technique to ensure that the three steps required for
DeferWindowPos are followed. We'll create a class to wrap
DeferWindowPos. The constructor for the class will call
BeginDeferWindowPos and the destructor will call
EndDeferWindowPos. Member functions will call
DeferWindowPos using the stored
HDWP handle required by these APIs. Calls to these methods will delay the window positioning until the destructor is called. So, to move two windows at once is as easy as the following:
CDeferPos dp(2); dp.MoveWindow(hWnd1, 0, 0, 10, 20, TRUE);
dp.MoveWindow(hWnd2, 10, 0, 10, 20, TRUE);
Note that the constructor takes a parameter indicating how many windows we think we'll move. This is just a suggestion that will help Windows to optimize the memory allocation. If you don't know how many windows you'll move, you can either guess or leave it to the default of 1. Windows will increase the memory size as needed when you move more windows than initially allocated.
For the complete code listing for
CDeferPos, check out the download.
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.
Windows developer with 10+ years experience working in the banking industry.