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!