• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 249
  • Last Modified:

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.
0
cdgough
Asked:
cdgough
1 Solution
 
ZoppoCommented:
Hi cdgough,

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

ZOPPO
0
 
abancroftCommented:
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.
0
 
Vinayak KumbarSr Program ManagerCommented:
Hi,
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.
0
Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

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

0
 
ZoppoCommented:
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 ...

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

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

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now