An CMultiDocTemplate extension
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!