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

这篇博客探讨了MFC应用程序的初始化过程,对比了Win32程序的初始化,并详细解释了MFC中CWinThread、CWinApp和CMyWinApp类的角色。通过类图和代码示例,展示了从main函数开始,如何通过虚函数调用来实现MFC的多态性和初始化流程。文章最后提到了在MFC框架中WinMain函数的隐含使用。
摘要由CSDN通过智能技术生成

       上一节简单学习了关于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值