Download demo project - 7 Kb
Download source files - 18 Kb
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.
The main problem with MTLW and MFC is the main window (aka
- MFC expects there to be one.
- MFC will close the application as soon as the main window is closed.
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
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.
1 void CMultiTopSample::OnFileNewwindow()
3 CMainFrame* pFrame = new CMainFrame;
7 WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
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:
1 void CMultiTopSample::OnAppExit()
3 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...
1 list< CTopLevelFrame* > m_listMainFrames ;
... and a few functions for manipulating them:
1 void AddFrame( CTopLevelFrame* pFrame ) ;
2 void KillFrame( CTopLevelFrame* pFrame ) ;
3 void ReplaceMainFrame( CTopLevelFrame* pFrame ) ;
Plus a special bonus function. I use this to do print preview in YATLW and disable all the regular TLWs while I do so.
1 void EnableFrames( BOOL bEnable );
CTopLevelFrame uses the
CMultiTopApp member functions in response to window creation and destruction messages.
AddFrame() after default processing
ReplaceMainFrame() before default processing
KillFrame() after default processing