HOWTO: Create New Documents Without CWinApp::OnFileNew

Last reviewed: July 10, 1997
Article ID: Q113257

The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), included with:

        - Microsoft Visual C++ for Windows, versions 1.0, 1.5, 1.51 1.52
        - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 2.1, 4.0,
          4.1, 4.2, 5.0
    

SUMMARY

It is sometimes desirable to create a CMultiDocTemplate based window (in other words, a CFrame/CDocument/CView combination) without using the mechanism provided by CWinApp::OnFileNew.

For example, if the program has multiple document templates, CWinApp::OnFileNew will prompt the user with a dialog box asking which type of document to open. The programmer may already know which type of CMultiDocTemplate to use, and therefore may not want to prompt the user because it would be inappropriate in the given context of the application.

MORE INFORMATION

Assuming the application was originally created with AppWizard, the undocumented CMultiDocTemplate::OpenDocumentFile function can be used to create a new CMultiDocTemplate based window. There are several steps involved:

  1. Add a CMultiDocTemplate pointer to your CWinApp derived class:

          class CMyApp : public CWinApp
          {
    
            ...
    
           public:
            CMultiDocTemplate* m_pDocTemplate;
    
            ...
    
          }
    
       NOTE: If you plan to use multiple document types, you must create a
       CMultiDocTemplate pointer member variable for each document type.
    
    

  2. In the call to CWinApp::InitInstance, remove the creation of the CMultiDocTemplate from the call to AddDocTemplate. Set the pointer to point to the new CMultiDocTemplate. Use the pointer to call AddDocTemplate:

          BOOL CMyApp::InitInstance()
          {
    
            ...
    
            m_pDocTemplate = new CMultiDocTemplate(IDR_TEXTTYPE,
                                          RUNTIME_CLASS(CMyDoc),
                                          RUNTIME_CLASS(CMDIChildWnd),
                                          RUNTIME_CLASS(CMyView));
    
            AddDocTemplate(m_pDocTemplate);
    
            ...
    
          }
    
    

  3. Use the pointer to call CMultiDocTemplate::OpenDocumentFile with a NULL parameter to create the new window. For this example, assume there is a button in a CView window. In the BN_CLICKED handler for the button, we want to create a window based on m_pDocTemplate:

          void CMyView::OnNewWindowButtonClicked()
          {
    
              CMyApp* pApp = (CMyApp*)AfxGetApp();
              pApp->m_pDocTemplate->OpenDocumentFile(NULL);
          }
    
       This same technique could be used to create a CSingleDocTemplate based
       window in a Single Document Interface (SDI) application. However, it is
       not necessary. Because there is only one document template for the
       application, calling OnFileNew() will create the new window without
       prompting the user for the type of document.
     
    
    	


Keywords : kbprg kbtool MfcDocView kbhowto
Technology : kbMfc
Version : 1.0 1.51 2.0 4.1 4.2 5.0
Platform : NT WINDOWS


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: July 10, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.