MFC菜鸟,使用MFC的向导生成的简单单文档程序中的CMainFrame类是在什么时候构造的啊

MFC初学者,使用MFC的向导生成的简单单文档程序中的CMainFrame类是在什么时候构造的啊?
如题:

CWinApp的对象是直接由全局对象构造的,
那CMainFrame类的对象是什么时候构造的呢?我跟踪了很久,发现是深不可测啊!
高手能不能指点我一下啊,

关于CMainFrame类的构造侯捷的《深入浅出MFC》和孙鑫的《VC++深入详解》都没有提到

------解决方案--------------------
/////////////////////////////////////////////////////////////////////////////
// CSingleDocTemplate commands

CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)
// if lpszPathName == NULL => create new file of this type
{
CDocument* pDocument = NULL;
CFrameWnd* pFrame = NULL;
BOOL bCreated = FALSE; // => doc and frame created
BOOL bWasModified = FALSE;

if (m_pOnlyDoc != NULL)
{
// already have a document - reinit it
pDocument = m_pOnlyDoc;
if (!pDocument-> SaveModified())
return NULL; // leave the original one

pFrame = (CFrameWnd*)AfxGetMainWnd();
ASSERT(pFrame != NULL);
ASSERT_KINDOF(CFrameWnd, pFrame);
ASSERT_VALID(pFrame);
}
else
{
// create a new document
pDocument = CreateNewDocument();
ASSERT(pFrame == NULL); // will be created below
bCreated = TRUE;
}

if (pDocument == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
return NULL;
}
ASSERT(pDocument == m_pOnlyDoc);

if (pFrame == NULL)
{
ASSERT(bCreated);

// create frame - set as main document frame
BOOL bAutoDelete = pDocument-> m_bAutoDelete;
pDocument-> m_bAutoDelete = FALSE;
// don 't destroy if something goes wrong
pFrame = CreateNewFrame(pDocument, NULL);
pDocument-> m_bAutoDelete = bAutoDelete;
if (pFrame == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
delete pDocument; // explicit delete on error
return NULL;
}
}

if (lpszPathName == NULL)
{
// create a new document
SetDefaultTitle(pDocument);

// avoid creating temporary compound file when starting up invisible
if (!bMakeVisible)
pDocument-> m_bEmbedded = TRUE;

if (!pDocument-> OnNewDocument())
{
// user has been alerted to what failed in OnNewDocument
TRACE(traceAppMsg, 0, "CDocument::OnNewDocument returned FALSE.\n ");
if (bCreated)
pFrame-> DestroyWindow(); // will destroy document
return NULL;
}
}
else
{
CWaitCursor wait;

// open an existing document
bWasModified = pDocument-> IsModified();
pDocument-> SetModifiedFlag(FALSE); // not dirty for open

if (!pDocument-> OnOpenDocument(lpszPathName))
{
// user has been alerted to what failed in OnOpenDocument
TRACE(traceAppMsg, 0, "CDocument::OnOpenDocument returned FALSE.\n ");
if (bCreated)
{
pFrame-> DestroyWindow(); // will destroy document
}
else if (!pDocument-> IsModified())
{
// original document is untouched
pDocument-> SetModifiedFlag(bWasModified);
}
else
{
// we corrupted the original document
SetDefaultTitle(pDocument);

if (!pDocument-> OnNewDocument())
{
TRACE(traceAppMsg, 0, "Error: OnNewDocument failed after trying "
"to open a document - trying to continue.\n ");
// assume we can continue
}
}
return NULL; // open failed
}
pDocument-> SetPathName(lpszPathName);