Custom Wizard -- Switching Dialogs smoothly.

I am creating a wizard, and I want to support some customization features that aren't available using the standard MFC Wizard. So my wizard consists of several dialogs that are displayed and removed as the user moves through the application.

Here is the problem:

When the user clicks NEXT or BACK, the current dialog disappears and the new dialog appears, causing the user to see nothing on the screen for a 1/4 second.

This is unlike the MFC Wizard -- since it uses property pages and property sheets, the background of the Wizard never disappears and the transition is very smooth.

My problem is caused because OnNext() or OnBack() essentially calls CurrnetDialog.EndDialog() then calls NewDialog.DoModal(). The time spent in-between these two functions is what causes the dialogs to "blink".

I know a few sloppy ways to correct this problem, but have still not found that "elegant" solution that I am looking for. If you can come up with an elegant solution, please provide a few lines of source to help explain it. Thanks.
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Hi cdgough,

You could use LockWindowUpdate()/UnlockWindowUpdate() for the parent of the dialog (or the desktop, if the dialog has no parent window)

Or create all the dialogs at wizard startup & then just show/hide them as the user presses BACK/NEXT.

This uses more memory & resources of course.
Vinayak KumbarSr Program ManagerCommented:
Why can't u go for timers

Before calling the DoModal() for next dialog, set the timer of very short duration. Then call DoModal(). Then in Timer function kill the timer and the dialog!!!

Try it out.
Cloud Class® Course: Python 3 Fundamentals

This course will teach participants about installing and configuring Python, syntax, importing, statements, types, strings, booleans, files, lists, tuples, comprehensions, functions, and classes.

cdgoughAuthor Commented:
If you give a little more information about the Lock and Unlock window update functions, I will award you the points.

This is from MSDN:

Window Update Lock:
A window update lock is a temporary suspension of drawing in a window. The system uses the lock to prevent other windows from drawing over the tracking rectangle whenever the user moves or sizes a window. Applications can use the lock to prevent drawing if they carry out similar moving or sizing operations with their own windows.

An application uses the LockWindowUpdate function to set or clear a window update lock, specifying the window to lock. The lock applies to the specified window and all of its child windows. When the lock is set, the GetDC and BeginPaint functions return a display device context with a visible region that is empty. Given this, the application can continue to draw in the window, but all output is clipped. The lock persists until the application clears it by calling LockWindowUpdate, specifying NULL for the window. Although LockWindowUpdate forces a window's visible region to be empty, the function does not make the specified window invisible and does not clear the WS_VISIBLE style bit.

After the lock is set, the application can use the GetDCEx function, with the DCX_LOCKWINDOWUPDATE value, to retrieve a display device context to draw over the locked window. This allows the application to draw a tracking rectangle when processing keyboard or mouse messages. The system uses this method when the user moves and sizes windows. GetDCEx retrieves the display device context from the display device context cache, so the application must release the device context as soon as possible after drawing.

While a window update lock is set, the system creates an accumulated bounding rectangle for each locked window. When the lock is cleared, the system uses this bounding rectangle to set the update region for the window and its child windows, forcing an eventual WM_PAINT message. If the accumulated bounding rectangle is empty (that is, if no drawing has occurred while the lock was set), the update region is not set.

what more can I say ...

cdgoughAuthor Commented:
Please add your comment as an answer so I can give you the points!

You also should be able to accept a comment as answer, but no proplem ... :)

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
System Programming

From novice to tech pro — start learning today.