Click here to Skip to main content
Licence 
First Posted 9 Feb 2000
Views 130,135
Bookmarked 46 times

Multiple Top Level Windows

By | 8 May 2003 | Article
Allows an application to have multiple top-level windows.
  • Download demo project - 7 Kb
  • Download source files - 18 Kb
  • Introduction

    MFC, out of the box, supports three interface models, MDI, SDI, and dialog based. What it doesn't have is support for MTLW (ok, so MS probably has a different acronym for it, but what I mean is Multiple Top Level Windows). This is the model popularized by those web browsers we all know and love, Netscape Navigator and Internet Explorer.

    Problem

    The main problem with MTLW and MFC is the main window (aka CWinApp::m_pMainWnd).

    1. MFC expects there to be one.
    2. MFC will close the application as soon as the main window is closed.

    Solution

    So what we need is a way to keep CWinApp::m_pMainWnd pointed at a valid TLW and switch it from one window to another as needed to make sure that the app doesn't shut down except when the last TLW is closed.

    Two classes will help you do this:

    • CMultiTopApp - should be used as the base class for your app object.
    • CTopLevelFrame - should be used as the base class for CMainFrame.
    Derive from these classes and wire up the message maps properly, and that's it. You're app now supports MTLW. Of course you need to have ways of creating new TLWs and probably you want to have a command to close all the windows and shut down your app, so the demo project includes those functions.

    First, a handler for the "New Window" menu item creates new TLWs.

    void CMultiTopSample::OnFileNewwindow() 
    {
    	CMainFrame* pFrame = new CMainFrame;
    
    	// create and load the frame with its resources
    	pFrame->LoadFrame(IDR_MAINFRAME,
    		WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
    		NULL);
    
    	// The one and only window has been initialized,<BR>	// so show and update it.
    	pFrame->ShowWindow(SW_SHOW);
    	pFrame->UpdateWindow();
    }

    Second, unless you want your users to have to close each window individually, you may want to have an "Exit" menu item which does the following:

    void CMultiTopSample::OnAppExit() 
    {
    	CloseAllFrames() ;
    }
    Is this easy, or what!

    How it works (briefly), and a BONUS member function:

    CMultiTopApp has an STL list for keeping track of TLWs...

    list< CTopLevelFrame* > m_listMainFrames ;
    ... and a few functions for manipulating them:

    void AddFrame( CTopLevelFrame* pFrame ) ;         // Adds a TLW to list
    void KillFrame( CTopLevelFrame* pFrame ) ;        // Removes TLW from list
    void ReplaceMainFrame( CTopLevelFrame* pFrame ) ; // Makes a differnt TLW the<BR>                                               // MFC main window if possible

    Plus a special bonus function. I use this to do print preview in YATLW and disable all the regular TLWs while I do so.

    void EnableFrames( BOOL bEnable ); // Enables/Disables all TLWs in list

    CTopLevelFrame uses the CMultiTopApp member functions in response to window creation and destruction messages.

    MESSAGE Handler Action
    WM_CREATE OnCreate() calls AddFrame() after default processing
    WM_CLOSE OnClose() calls ReplaceMainFrame() before default processing
    WM_DESTROY OnDestroy() calls KillFrame() after default processing

    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

    Sir Gras of Berger

    Web Developer

    United States United States

    Member



    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    You must Sign In to use this message board. (secure sign-in)
     
    Search this forum  
     FAQ
        Noise  Layout  Per page   
      Refresh
    NewsVisual Studio 2010 has it builtin Pinmemberkiwi_11:08 4 Oct '10  
    GeneralLicense PinmemberBarryHolleran0:25 9 Apr '08  
    GeneralAfxMessageBox problem and solution PinmemberKHDev4u9:55 21 Apr '05  
    Generalwhen the MainForm is Minimized Pinmemberqiaoyun22:55 28 Feb '05  
    GeneralGreat ! PinmemberRodrigo Pinho Pereira de Souza9:46 7 Jul '04  
    GeneralQuestion Pinmemberlequang19:34 5 Feb '04  
    GeneralSmall extension to this excellent class... PinmemberBrendan Tregear19:01 26 Aug '03  
    GeneralMultiple Top Level Windows in BCB 6 Pinmemberbmanjones4:31 24 Feb '03  
    GeneralNote for VC++ 7 (.NET) users PinmemberTunny9:18 9 Feb '03  
    GeneralRe: Note for VC++ 7 (.NET) users PinmemberBrendan Tregear16:35 7 Aug '03  
    GeneralRe: Note for VC++ 7 (.NET) users Pinsussjames@tunny.co.uk20:09 7 Aug '03  
    GeneralRe: Note for VC++ 7 (.NET) users PinmemberBrendan Tregear0:29 11 Aug '03  
    QuestionHow to deal with Documents PinmemberJoe Varadi23:34 6 Feb '02  
    GeneralIsn't the Way "Multiple Top-Level Windows" are done PinsussBrian Hart20:07 7 Jul '00  
    GeneralRe: Isn't the Way PinsussDon Grasberger3:49 10 Jul '00  
    GeneralRe: Isn't the Way PinsussRob Krakora16:03 31 Jul '00  
    GeneralRe: Isn't the Way PinmemberVaclav10:12 7 Aug '03  
    GeneralRe: Isn't the Way PinmemberGiles3:57 12 Jul '05  
    QuestionHow to avoid > 1 entry in the taskbar? PinsussPeter Andersson11:09 19 May '00  
    AnswerRe: How to avoid > 1 entry in the taskbar? PinsussRob Krakora3:18 14 Jun '00  
    GeneralRe: How to avoid > 1 entry in the taskbar? PinmemberSam C8:49 2 Dec '01  
    GeneralRe: How to avoid > 1 entry in the taskbar? PinmemberMike O'Neill12:48 9 May '03  

    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.

    Permalink | Advertise | Privacy | Mobile
    Web01 | 2.5.120517.1 | Last Updated 9 May 2003
    Article Copyright 2000 by Sir Gras of Berger
    Everything else Copyright © CodeProject, 1999-2012
    Terms of Use
    Layout: fixed | fluid