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

Multiple Top Level Windows

, 8 May 2003
Rate this:
Please Sign up or sign in to vote.
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

    Share

    About the Author

    Sir Gras of Berger
    Web Developer
    United States United States
    No Biography provided

    Comments and Discussions

     
    NewsVisual Studio 2010 has it builtin Pinmemberkiwi_4-Oct-10 12:08 
    GeneralLicense PinmemberBarryHolleran9-Apr-08 1:25 
    GeneralAfxMessageBox problem and solution PinmemberKHDev4u21-Apr-05 10:55 
    GeneralRe: AfxMessageBox problem and solution PinmemberJanos Kerekes24-Oct-13 6:25 
    Generalwhen the MainForm is Minimized Pinmemberqiaoyun28-Feb-05 23:55 
    GeneralGreat ! PinmemberRodrigo Pinho Pereira de Souza7-Jul-04 10:46 
    GeneralQuestion Pinmemberlequang5-Feb-04 20:34 
    GeneralSmall extension to this excellent class... PinmemberBrendan Tregear26-Aug-03 20:01 
    GeneralMultiple Top Level Windows in BCB 6 Pinmemberbmanjones24-Feb-03 5:31 
    GeneralNote for VC++ 7 (.NET) users PinmemberTunny9-Feb-03 10:18 
    GeneralRe: Note for VC++ 7 (.NET) users PinmemberBrendan Tregear7-Aug-03 17:35 
    GeneralRe: Note for VC++ 7 (.NET) users Pinsussjames@tunny.co.uk7-Aug-03 21:09 
    GeneralRe: Note for VC++ 7 (.NET) users PinmemberBrendan Tregear11-Aug-03 1:29 
    QuestionHow to deal with Documents PinmemberJoe Varadi7-Feb-02 0:34 
    GeneralIsn't the Way "Multiple Top-Level Windows" are done PinsussBrian Hart7-Jul-00 21:07 
    GeneralRe: Isn't the Way PinsussDon Grasberger10-Jul-00 4:49 
    GeneralRe: Isn't the Way PinsussRob Krakora31-Jul-00 17:03 
    GeneralRe: Isn't the Way PinmemberVaclav7-Aug-03 11:12 
    GeneralRe: Isn't the Way PinmemberGiles12-Jul-05 4:57 
    QuestionHow to avoid > 1 entry in the taskbar? PinsussPeter Andersson19-May-00 12:09 
    AnswerRe: How to avoid > 1 entry in the taskbar? PinsussRob Krakora14-Jun-00 4:18 
    GeneralRe: How to avoid > 1 entry in the taskbar? PinmemberSam C2-Dec-01 9:49 
    GeneralRe: How to avoid > 1 entry in the taskbar? PinmemberMike O'Neill9-May-03 13:48 

    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 | Terms of Use | Mobile
    Web02 | 2.8.1411028.1 | Last Updated 9 May 2003
    Article Copyright 2000 by Sir Gras of Berger
    Everything else Copyright © CodeProject, 1999-2014
    Layout: fixed | fluid