Plain GDI. GDI+ is an option but I don't think it would help here. I can't use WPF as it's a C++ app.
The effects window I'm overlaying has a static copy of what the main window used to look like. On to that I'm using DWM to render a live copy of the main window. The live copy scrolls/fades/zooms to give a smooth transition from the old UI state to the new one.
Doing it this way means the existing UI elements don't need to be modified for the effect to work; they just paint themselves as normal. During the transition the UI remains "live", painting updates and responding to the mouse and keyboard (since the effects window is "click-through"). With just two lines of code I can add a transition effect to almost any UI change.
It all seems to work great, except if the effect is triggered while DWM is applying its own transition animations to the window. So if I could just detect when/whether those are happening I could disable my effect.
(Obviously I also have to worry about the main window being moved or resized while the effects window is over the top of it. That is easy enough. The problem with the DWM animations is that they visually move the window and yet it doesn't move as far as things like GetWindowRect or WM_SIZE are concerned.)
Maybe a picture shows it better. Say notepad is opening:
(It's actually a screenshot of notepad closing, as that was easier to capture, but just pretend it's opening instead.
)

If you were to overlay a copy of its client area on top of where the OS reports it to be, you'd end up with this:
