Click here to Skip to main content
Click here to Skip to main content

A flicker issue in MDI applications

, 23 Aug 2005
Rate this:
Please Sign up or sign in to vote.
Provides a fix to the flicker problem in MDI applications.

Sample Image - MDIFlickDemo.jpg

Issue

This article illustrates how to fix a common flicker problem in MDI applications when you create or activate an MDI child and an application is in maximized state. You catch a glimpse of the new activated MDI child shown at the picture above.

To reproduce the problem:

  1. Create a new MFC MDI application project.
  2. Run and maximize the application.
  3. In maximized state, create a few MDI children and try switching between them.

When you create a new or activate an inactive window, you will see the flicker.

Workaround

The solution to the problem is very simple. The flicker comes from drawing the caption, the frame and the client area of the restored MDI child. To eliminate it, override "WindowProc" in your class derived from CMDIChildWnd. For the non-client area, filter WM_NCPAINT message, and for the client area, handle WM_SIZE message like this:

if(message==WM_SIZE) // client area
{
    if(wParam==SIZE_MAXIMIZED && pChildFrame==this)
    // active and maximized
        return CMDIChildWnd::WindowProc(message, wParam, lParam);

    SetRedraw(FALSE); // disable drawing
    LRESULT ret = CMDIChildWnd::WindowProc(message, 
                   wParam, lParam); // default Window procedure
    SetRedraw(); // enable drawing
    return  ret;
}

In the previous version of this article I also filtered message 174. Ignoring this message prevents drawing non-themed caption buttons. The picture of the buttons looks like this:

Caption Buttons

This message is also sent when a window is restored. Now drawing for restored windows is disabled, so we don't need "message==174" in the "if" statement anymore.

I have also added if(message==WM_NCPAINT || message==WM_SIZE) as a first line in the window procedure. It prevents from assertion in objcore.cpp (AfxAssertValidObject) when you try to close the MDI child, the view is derived from CHtmlView and the active configuration is "Debug".

So the workaround code looks like this:

LRESULT CChildFrame::WindowProc(UINT message, 
                       WPARAM wParam, LPARAM lParam) 
{
    if(message==WM_NCPAINT || message==WM_SIZE)
    {
        BOOL bMax;
        CMDIFrameWnd* pParentFrame = (CMDIFrameWnd*)GetParentFrame();
        if(pParentFrame)
        {
            CMDIChildWnd* pChildFrame = pParentFrame->MDIGetActive(&bMax);
            if(bMax)
            {    
                if(message==WM_NCPAINT) // non client area
                    return 0;
                    
                if(message==WM_SIZE) // client area
                {
                    if(wParam==SIZE_MAXIMIZED && 
                       pChildFrame==this) // active and maximized
                      return CMDIChildWnd::WindowProc(message, wParam, lParam);

                    SetRedraw(FALSE);
                    LRESULT ret = 
                      CMDIChildWnd::WindowProc(message, wParam, lParam);
                    SetRedraw();
                    return  ret;
                }
            }
        }
    }
    return CMDIChildWnd::WindowProc(message, wParam, lParam);
}

A demo application

Check/uncheck the "FIX" button to enable/disable the fix code.

License

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

About the Author

Andrzej Markowski
Software Developer (Senior)
United States United States
No Biography provided

Comments and Discussions

 
QuestionA workaround solution for the flickering problem Pinmemberszorik31-Jul-11 22:55 
QuestionMaximize window Pinmembermanojv18-Oct-07 0:51 
GeneralSolution for Managed Code Pinmembertonyt8-Jul-07 18:47 
GeneralKeyboard navigation PinmemberMarcus Deecke27-Apr-07 1:26 
AnswerThe Real solutions PinmemberAli Rafiee9-Feb-06 5:30 
GeneralAlternative PinmemberGast12824-Aug-05 22:10 
GeneralSmall correction PinmemberAndrzej Markowski14-Aug-05 7:44 
GeneralA correct version of the code PinmemberAndrzej Markowski13-Aug-05 10:04 
GeneralGood enough to say, "Seemed to have solved the flickering issue." PinmemberWREY13-Aug-05 11:51 
GeneralCase where code doesnt work Pinmemberpicazo23-Jan-06 12:14 
GeneralRe: Case where code doesnt work PinmemberAndrzej Markowski26-Jan-06 16:17 
QuestionWouldn't LockWindowUpdate be better and easier? PinmemberJeff LeBert11-Aug-05 4:45 
AnswerRe: Wouldn't LockWindowUpdate be better and easier? Pinmemberrobrich12-Aug-05 4:36 
GeneralIn C# Pinmemberrobrich10-Aug-05 21:05 
GeneralRe: In C# Pinmemberrobrich12-Aug-05 4:26 
GeneralRe: In C# PinmemberTim McCurdy30-Aug-05 4:28 
GeneralRe: In C# Pinmemberrobrich30-Aug-05 6:22 
GeneralRe: In C# Pinmemberrobrich30-Aug-05 6:30 
GeneralRe: In C# PinmemberTim McCurdy30-Aug-05 16:01 
GeneralRe: In C# [modified] PinmemberMing Liu21-Jul-06 17:55 
GeneralRe: In C# PinmemberYvescion20-Oct-06 11:39 
GeneralRe: In C# Pinmembergobgob15-May-07 19:41 
GeneralRe: Infragistics TabbedMDIManager flicker PinmemberMark Treveil1-Jul-07 10:56 
GeneralMy friend flicker PinmemberRancidCrabtree10-Aug-05 13:10 
GeneralSometimes it still flickers. PinmemberWREY4-Aug-05 6:57 
QuestionRe: Sometimes it still flickers. PinsitebuilderUwe Keim4-Aug-05 9:25 
GeneralRe: Sometimes it still flickers. PinmemberAndrzej Markowski4-Aug-05 15:25 
GeneralRe: Sometimes it still flickers. PinmemberAndrzej Markowski4-Aug-05 15:19 
GeneralRe: Sometimes it still flickers. PinmemberAndrzej Markowski13-Aug-05 10:16 
GeneralMuch better !! PinmemberWREY13-Aug-05 11:28 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140718.1 | Last Updated 23 Aug 2005
Article Copyright 2005 by Andrzej Markowski
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid