作者:liguisen
blog:http://blog.csdn.net/liguisen/
如上篇所说,由于MFC基于Dialog based的工程InitInstance()函数中永远return FALSE,导致我们无法继续往下分析,于是现在来分析一下SDI工程。
前面和Dialog based的工程类似,先建立一个名为Sdi的SDI工程。在向导的第三步,把ActiveX Controls的勾去掉;在第四步,也是把所有的勾都去掉,单击Advanced,选择Windows Styles,同样把所有的勾都去掉(从前面对Dialog based工程的分析知道,反正我们最后都是要删掉的)。
工程建立后,如Dialog based工程,删掉相关代码,尽可能多的加断点,但IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd),IMPLEMENT_DYNCREATE(CSdiDoc, CDocument),IMPLEMENT_DYNCREATE(CSdiView, CView)这3句不加(涉及动态创建等东西,目前不适合我们这篇文章,可参考深入浅出MFC),然后F5运行,最后的代码及程序运行步骤如下:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
StdAfx.h:
#include <afxwin.h>
#include <afxext.h>
#include <afxdtctl.h>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
StdAfx.cpp:
#include "stdafx.h"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MainFrm.h:
class CMainFrame : public CFrameWnd
{
protected:
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual ~CMainFrame();
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MainFrm.cpp:
#include "stdafx.h"
#include "Sdi.h"
#include "MainFrm.h"
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
CMainFrame::CMainFrame()
{//zuilang:第12步
}//zuilang:第13步
CMainFrame::~CMainFrame()
{//zuilang:第41步
}//zuilang:第42步
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{//zuilang:第14、19步
if( !CFrameWnd::PreCreateWindow(cs) ) //zuilang:第15、20步
return FALSE;
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
; //zuilang:第16、21步
return TRUE; //zuilang:第17、22步
}//zuilang:第18、23步
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sdi.h:
#include "resource.h"
class CSdiApp : public CWinApp
{
public:
CSdiApp();
virtual BOOL InitInstance();
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sdi.cpp:
#include "stdafx.h"
#include "Sdi.h"
#include "MainFrm.h"
#include "SdiDoc.h"
#include "SdiView.h"
CSdiApp::CSdiApp()
{//zuilang:第2步
}//zuilang:第3步
CSdiApp theApp;//zuilang:第1步
BOOL CSdiApp::InitInstance()
{//zuilang:第4步
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSdiDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CSdiView)); //zuilang:第5步
AddDocTemplate(pDocTemplate); //zuilang:第6步
CCommandLineInfo cmdInfo; //zuilang:第7步
ParseCommandLine(cmdInfo); //zuilang:第8步
if (!ProcessShellCommand(cmdInfo)) //zuilang:第9步
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW); //zuilang:第33步
m_pMainWnd->UpdateWindow();//zuilang:第34步
return TRUE; //zuilang:第37步
}//zuilang:第38步
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SdiDoc.h:
class CSdiDoc : public CDocument
{
protected:
CSdiDoc();
DECLARE_DYNCREATE(CSdiDoc)
public:
virtual BOOL OnNewDocument();
virtual ~CSdiDoc();
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SdiDoc.cpp:
#include "stdafx.h"
#include "Sdi.h"
#include "SdiDoc.h"
IMPLEMENT_DYNCREATE(CSdiDoc, CDocument)
CSdiDoc::CSdiDoc()
{ //zuilang:第10步
} //zuilang:第11步
CSdiDoc::~CSdiDoc()
{//zuilang:第43步
}//zuilang:第44步
BOOL CSdiDoc::OnNewDocument()
{ //zuilang:第29步
if (!CDocument::OnNewDocument())//zuilang:第30步
return FALSE;
return TRUE; //zuilang:第31步
} //zuilang:第32步
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SdiView.h:
class CSdiView : public CView
{
protected:
CSdiView();
DECLARE_DYNCREATE(CSdiView)
public:
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual ~CSdiView();
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SdiView.cpp:
#include "stdafx.h"
#include "Sdi.h"
#include "SdiDoc.h"
#include "SdiView.h"
IMPLEMENT_DYNCREATE(CSdiView, CView)
CSdiView::CSdiView()
{ //zuilang:第24步
} //zuilang:第25步
CSdiView::~CSdiView()
{//zuilang:第39步
}//zuilang:第40步
BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs)
{ //zuilang:第26步
return CView::PreCreateWindow(cs); //zuilang:第27步
} //zuilang:第28步
void CSdiView::OnDraw(CDC* pDC)
{//zuilang:第35步,此时去掉这一句的断点
}//zuilang:第36步,此时去掉这一句的断点
大概的流程如下:
构造应用程序类全局对象theApp-》应用程序类初始化InitInstance()-》构造文档CSdiDoc()-》构造主框架CmainFrame()-》准备创建框架窗口CMainFrame::PreCreateWindow-》构造视CSdiView()-》准备创建视窗口CSdiView::PreCreateWindow-》打开新文档CSdiDoc::OnNewDocument()-》显示窗口m_pMainWnd->ShowWindow-》更新窗口m_pMainWnd->UpdateWindow()-》重绘窗口CSdiView::OnDraw-》析构视~CSdiView()-》析构框架~CMainFrame()-》析构文档~CSdiDoc()
MFC应用程序详细的启动过程比上面的要复杂n倍!下一篇进行更深入的分析!