65.9K
CodeProject is changing. Read more.
Home

An CMultiDocTemplate extension

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (3 votes)

Aug 27, 2002

CPOL
viewsIcon

98254

downloadIcon

1735

A more real Document Template Class

Introduction

When we build and run an MFC MDI application, it initially opens a new empty document for us. Then when we open an existing document, it creates a new frame and opens the document in that frame. But I feel that it will be more kindly if it just replaces the unmodified empty document and open the existing document in the same frame. So I decided to derive a new class from CMultiDocTemplate and name it CMultiDocTemplateEx to do such things.

I just overrode OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible), before directly calling the base class's OpenDocumentFile() method. I made some test. If there is only ONE document and it is UNMODIFIED, I call the document's OnOpenDocument() with lpszPathName, and call it's SetPathName(). Any other case, we call CMultiDocTemplate::OpenDocumentFile() directly. The code is quite straightforward.

CDocument* CMultiDocTemplateEx::OpenDocumentFile(LPCTSTR lpszPathName,
                                                    BOOL bMakeVisible)
{
    if (m_docList.GetCount() == 1)
    {
        CDocument* pDocument = (CDocument*)m_docList.GetHead();
        if (pDocument->GetPathName().IsEmpty() && !pDocument->IsModified())
        {
            CWaitCursor wait;
            if (!pDocument->OnOpenDocument(lpszPathName))
            {
                TRACE0("CDocument::OnOpenDocument returned FALSE.\n");
                return NULL;
            }
            pDocument->SetPathName(lpszPathName);
            POSITION pos = pDocument->GetFirstViewPosition();
            CView* pView = pDocument->GetNextView(pos);
            CFrameWnd* pFrame = pView->GetParentFrame();
            InitialUpdateFrame(pFrame, pDocument);
            return pDocument;
        }
    }
    return CMultiDocTemplate::OpenDocumentFile(lpszPathName, bMakeVisible);
}

Do not know how to use it? Okay, add MultiDocTemplateEx.cpp and MultiDocTemplateEx.h to your project and include the header in your stdafx.h like this

#include "MultiDocTemplateEx.h"

Then in the InitInstance, change CMultiDocTemplate to CMultiDocTemplateEx, or just add "Ex" after that word, build, run, test it!