上一节简单学习了关于MFC中简单的层次结构,而MFC程序的初始化过程究竟是怎么样的呢,与普通Win32初始化的联系又在哪呢?
Win32程序通过RegisterClass,CreateWindow,ShowWindow,UpdateWindow实现对程序的初始化,下面我们来看对MFC初始化的仿真。
*MFC程序的初始化过程
先上类图:
我们来看main函数:
CMyWinApp theApp;
int _tmain(int argc, _TCHAR* argv[])
{
CWinApp * pApp = AfxGetApp();
pApp->InitApplication();
pApp->InitInstance();
pApp->Run();
system("pause");
return 0;
}
(1)首先产生一个CMyWinApp theApp对象。
(2)进入main函数,因为在CWinThread中增加了两个虚函数: InitIstance()和run(),CWinApp中增加了虚函数InitApplication(),虚函数在子类中进行override,实现了类的多态,即main函数CwinApp *pApp中依次调用的函数是:CWinApp::InitApplication(),CMyWinApp::InitInstance(),CWinApp::Run()。
(3)函数进入CWinApp::InitApplication()
(4)函数进入CMyWinApp::InitInstance()
virtual BOOL InitInstance()
{
std::cout << "CMyWinApp::InitInstance \n";
m_pMainWnd = new CMyFrameWnd;
return TRUE;
}
调用CMyFrameWnd的构造函数
CMyFrameWnd()
{
Create();
std::cout << "CMyFrameWnd Constructor \n";
}
此处根据多态性,调用CFrameWnd::Create() (CFrameWnd覆盖掉了父类CWnd虚函数)
BOOL Create()
{
std::cout << "CFrameWnd::Create \n";
CreateEx();
return TRUE;
}
再调用CWnd::CreateEx()
BOOL CreateEx()
{
std::cout << "CWnd::CreateEx \n";
PreCreateWindow();
return TRUE;
}
此处PreCreateWindow()已被CFrameWnd override,此处调用CFrameWnd::PreCreateWindow();[不得不提这也是虚函数的奇妙所在]在此完成CFrameWnd的构造函数,继而进行CMyFrameWnd的构造函数。
(5)函数进入CWinApp::Run()
virtual void Run()
{
std::cout << "CWinApp::Run \n";
return CWinThread::Run();
}
继而调用CWinThread::Run()完成整个过程。
下面是运行结果截图:
我们来回到前面的类图,执行顺序如图下
整个流程如图,不得不说在MFC框架仿真中,虚函数是多么重要。
在以上流程中我们仿真了MFC的初始化过程,但是过程中我们并未见到WinMain()函数,函数消失了吗?其实并不是,我们来看下面。
如果我新建一个MFC程序,只添加以下几行代码:
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance()
{
AfxMessageBox(L"test!");
return TRUE;
}
我们发现程序依然可以 运行,弹窗。的确MFC好像已经将WinMain,消息循环等封装进了CMyWinApp等的构造之中,这也就是后面会探究学习的地方。