- BOOL CMyApp::InitInstance()
- {
- CSingleDocTemplate* pDocTemplate;
- pDocTemplate = new CSingleDocTemplate( //步骤一
- IDR_MAINFRAME,
- RUNTIME_CLASS(CMyDoc),
- RUNTIME_CLASS(CMainFrame),
- RUNTIME_CLASS(CMyView));
- if (!pDocTemplate)
- return FALSE;
- AddDocTemplate(pDocTemplate); //步骤二 m_pDocManager->AddDocTemplate(pDocTemplate);
- CCommandLineInfo cmdInfo;
- ParseCommandLine(cmdInfo); //步骤三 通过void CWinApp::OnFileNew()=>m_pDocManager->OnFileNew();创建Doc、Frame、View
- }
- //================================分析如下======================================================
- //========步骤一=======
- RUNTIME_CLASS(CMainFrame)
- //展开得==》
- (CRuntimeClass*)(&CMainFrame::classCMainFrame)
- //从而在
- pDocTemplate = new CSingleDocTemplate(
- IDR_MAINFRAME,
- ((CRuntimeClass*)(&CMyDoc::classCMyDoc)),
- ((CRuntimeClass*)(&CMainFrame::classCMainFrame)),
- ((CRuntimeClass*)(&CMyView::classCMyView)));
- //通过构造函数初始化了三大关键成员===>
- class AFX_NOVTABLE CDocTemplate : public CCmdTarget
- {
- CRuntimeClass* m_pDocClass; //=((CRuntimeClass*)(&CMyDoc::classCMyDoc)) // class for creating new documents
- CRuntimeClass* m_pFrameClass; //=((CRuntimeClass*)(&CMainFrame::classCMainFrame))// class for creating new frames
- CRuntimeClass* m_pViewClass; //=((CRuntimeClass*)(&CMyView::classCMyView))) // class for creating new views
- };
- //========步骤二=======
- //将文档模板(含三口组)放入到文档模板链表中,并由CDocManager类对象进行管理
- //========步骤三=======
- //m_pDocManager->OnFileNew()调用CDocTemplate中CFrame/CDocument的创建方法,这里终于用到了“执行期动态创建”
- CFrameWnd* CDocTemplate::CreateNewFrame
- {
- context.m_pNewViewClass = m_pViewClass;
- CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();
- }
- CDocument* CDocTemplate::CreateNewDocument
- {
- CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
- }
MFC -- CMyApp::InitInstance()过程分析
最新推荐文章于 2021-02-16 10:53:51 发布