Download source files - 1 Kb
<!-- Article Starts -->
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 insures the finalization occurs.
The most widely known use of this technique is the std::auto_ptr class, which
insures the pointer is deleted when the auto_ptr leaves scope.
We can use this same technique to insure 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
For the complete code listing for CDeferPos check out the download.