Multiple frame windows in SDI application


I have an application where I need to work with two CFrameWnd with corresponding documents and views (not MDI, more like SDI * 2). But how can I have two main frame windows? I couldn't find anything in the docs or here on

So I fired up Visual Studio, and started to single-step InitInstance of a regular SDI application. It should probably not be a surprise that it was the CDocTemplate class that does most of the work.

My test example is called MultiApp, so the standard App-Wizard generated document is called CMultiAppDoc, and the corresponding view is CMultiAppView.

It is only necessary to change code in the InitInstance() member of your CWinApp-derived class.

Here is how to do it:

1. Create classes CMainFrame2, CMultiAppDoc2 and MultiAppView2 (the base classes of these classes are left as an exercise for the reader :-) ). Remember resources (icons, string table, menus etc.)

2. Create four private member variables in your CWinApp-derived class:

CSingleDocTemplate* m_pDoc1Template;
CSingleDocTemplate* m_pDoc2Template;
CMainFrame* m_pMainFrame;
CMainFrame2* m_pMainFrame2;
3. Register document templates in InitInstance():

 m_pDoc2Template = new CSingleDocTemplate(
  RUNTIME_CLASS(CMainFrame2), // main SDI frame window

 m_pDoc1Template = new CSingleDocTemplate(
  RUNTIME_CLASS(CMainFrame), // second main SDI frame window
4. Create mainframes with corresponding views:

ASSERT(m_pDoc2Template != NULL);
ASSERT_KINDOF(CDocTemplate, m_pDoc2Template);
ASSERT(m_pDoc1Template != NULL);
ASSERT_KINDOF(CDocTemplate, m_pDoc1Template);

m_pDoc2Template->OpenDocumentFile(NULL, FALSE);
ASSERT_KINDOF(CMainFrame2, m_pMainWnd);
m_pMainFrame2 = static_cast(m_pMainWnd);
pTmpMainWnd = m_pMainWnd;
m_pMainWnd = NULL;
m_pDoc1Template->OpenDocumentFile(NULL, FALSE);
ASSERT_KINDOF(CMainFrame, m_pMainWnd);
m_pMainFrame = static_cast(m_pMainWnd);


5. Remove the call to ProcessShellCommand, and handle command line parameters yourself.

6. When either of the mainframes receives focus, set the m_pMainWnd member of your CWinApp-derived class to either m_pMainFrame2 or m_pMainFrame.

7. Overload members in your frame windows, documents and views. You may have to overload further members in your CWinApp-derived class to get the functionality you desire. Check the demo project, but remember that it is a very simple example.

Download demo project - 76 KB

Date Last Updated: April 3, 1999


  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • As all sorts of data becomes available for storage, analysis and retrieval - so called 'Big Data' - there are potentially huge benefits, but equally huge challenges...
  • The agile organization needs knowledge to act on, quickly and effectively. Though many organizations are clamouring for "Big Data", not nearly as many know what to do with it...
  • Cloud-based integration solutions can be confusing. Adding to the confusion are the multiple ways IT departments can deliver such integration...

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date