MFC六大关键技术之仿真学习笔记(二)

来源:互联网 发布:青岛网络电视户外运动 编辑:程序博客网 时间:2024/05/16 05:17

       上一节简单学习了关于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等的构造之中,这也就是后面会探究学习的地方。



0 0
原创粉丝点击