01 MFC的初始化

在上一篇简单的MFC程序中, 还有好多疑惑没有解开,学C的人都习惯,看程序先找main,但是上篇中程序的main在哪,为啥能弄出一个窗口来还不是很清晰,就算Win32学了,也不一定能想通;这篇主要用写小例子来从另一个角度来看MFC的初始化过程;
我们都知道,全局变量的初始化过程在main函数执行之前;那么我们就先来看下面这个小例子,这个小例子对理解MFC非常有帮助,一定要看懂!

/*
 *test.cpp
 */
#include <iostream>

using namespace std;

class CWinApp{
public:
	CWinApp();
	~CWinApp();
};

CWinApp::CWinApp()
{
	cout << "CWinApp constructor start!" << endl;
}

CWinApp::~CWinApp()
{
	cout << "CWinApp destructor start!" << endl;
	//此处为了看效果,实际写代码时不建议这么写
	getchar();
}

CWinApp myApp;

int main()
{
	cout << "main start!" << endl;
	return 0;
}

运行效果如下图:
在这里插入图片描述从运行结果我们可以看出,我们定义的myApp对象的构造函数先于main函数执行,有了这点C++基础我们就知道,当我们想要在main前添加东西应该怎么添加了;
接下来我们就找一找我们的WinMain吧,我们切回我们上一篇的程序,在如图下断点;
在这里插入图片描述
然后VS中F10逐过程跟,我们就可以成功找到我们期盼已久的, 是不是很熟悉;
在这里插入图片描述
但是仔细一看,不对啊,我们Win32用的是WinMain啊,这加一个Afx是什么鬼,那我们继续找咯;这个找的思路怎么找呢,既然是MFC相关的,那我们在VS安装路径中找MFC相关文件夹咯,然后逐个文件夹搜索文本内容找WinMain,最后锁定文件D:\vs2013\VC\atlmfc\src\mfc\appmodul.cpp(请根据自己的安装路径寻找),然后在我们的VS2013中上篇中项目开启的情况下点击文件–>打开–>文件将刚才那个文件打开如下图,可以看到有一个_tWinMain调用 了刚才上面那个AfxWinMain,那我们在这下个断点呗,看看是不是会跑到这;
在这里插入图片描述
果然程序在这停住了,但是,好像与我们的WinMain还是有点点差别;这时该怎么办呢,WinMain你在哪啊?
在这里插入图片描述
这时我们来怎么继续呢,想想这_tWinMain跟WinMain这么像,会不会是个宏呢?哇,有思路就好办了,复制一个 _tWinMain,光标定位到中间,F12一跳,还真是个宏
在这里插入图片描述
还不是,那继续点呗,F12,这下总算找到了,真是纵里寻她千百度,她却在深山老林中
在这里插入图片描述
WinMain找完了,我们的C情节也该放一放了,还是继续看我们的小示例如何仿照上一篇例子运行过程吧;下面我们来看一下MFC的类层次图,来认识一些CWinApp有哪些祖宗(哈哈);
在这里插入图片描述
同样我们再来看看,CFrameWnd有哪些爹啊爷爷啊啥的;
在这里插入图片描述
下面我们就继续来改进我们本篇的小示例啊,为了方便演示和理解以及复制我就不分文件写类了,都写一个文件中了;

/*
 *class.h
 */
#ifndef _CLASS_H_
#define _CLASS_H_

class CWnd;

class CObject{
public:
	CObject();
	~CObject();
};

/*************完美分割线**************/
class CCmdTarget : public CObject{
public:
	CCmdTarget();
	~CCmdTarget();
};

/*************完美分割线**************/
class CWinThread : public CCmdTarget{
public:
	CWinThread();
	~CWinThread();
	virtual bool InitInstance() = 0;
public:
	CWnd *m_pMainWnd;
};

/*************完美分割线**************/
class CWinApp : public CWinThread{
public:
	CWinApp();
	~CWinApp();
};

/*************完美分割线**************/
class CWnd : public CCmdTarget{
public:
	CWnd();
	~CWnd();
};

/*************完美分割线**************/
class CFrameWnd : public CWnd{
public:
	CFrameWnd();
	~CFrameWnd();
};
#endif
/*
 *class.cpp
 */
#include "class.h"
#include <iostream>

using namespace std;
/*************完美分割线**************/
CObject::CObject()
{
	cout << "CObject constructor start!" << endl;
}

CObject::~CObject()
{
	cout << "CObject destructor start!" << endl;
}

/*************完美分割线**************/
CCmdTarget::CCmdTarget()
{
	cout << "CCmdTarget constructor start!" << endl;
}

CCmdTarget::~CCmdTarget()
{
	cout << "CCmdTarget destructor start!" << endl;
}

/*************完美分割线**************/
CWinThread::CWinThread()
{
	cout << "CWinThread constructor start!" << endl;
}

CWinThread::~CWinThread()
{
	cout << "CWinThread destructor start!" << endl;
}

/*************完美分割线**************/
CWinApp::CWinApp()
{
	cout << "CWinApp constructor start!" << endl;
}

CWinApp::~CWinApp()
{
	cout << "CWinApp destructor start!" << endl;
}

/*************完美分割线**************/
CWnd::CWnd()
{
	cout << "CWnd constructor start!" << endl;
}

CWnd::~CWnd()
{
	cout << "CWnd destructor start!" << endl;
}

/*************完美分割线**************/
CFrameWnd::CFrameWnd()
{
	cout << "CFrameWnd constructor start!" << endl;
}

CFrameWnd::~CFrameWnd()
{
	cout << "CFrameWnd destructor start!" << endl;
}
/*
 *HelloMFC.h
 */
#ifndef _HELLO_MFC_
#define _HELLO_MFC_
#include "class.h"

class CMyApp : public CWinApp{
public:
	CMyApp();
	~CMyApp();
	virtual bool InitInstance();
public:
	CMyApp *m_CurrentApp;
};

class CMainWindow : public CFrameWnd{
public:
	CMainWindow();
	~CMainWindow();
	void Create();
};

#endif
/*
 *HelloMFC.cpp
 */
#include "HelloMFC.h"
#include <iostream>

using namespace std;

CMyApp::CMyApp()
{
	cout << "CMyApp constructor start!" << endl;
	m_CurrentApp = this;
}

CMyApp::~CMyApp()
{
	cout << "CMyApp destructor start!" << endl;
}

bool CMyApp::InitInstance()
{
	cout << "CMyApp::InitInstance()" << endl;
	m_pMainWnd = new CMainWindow;

	return true;
}

/*************完美分割线**************/
CMainWindow::CMainWindow()
{
	cout << "CMainWindow constructor start!" << endl;
	Create();
}

CMainWindow::~CMainWindow()
{
	cout << "CMainWindow destructor start!" << endl;
}

void CMainWindow::Create()
{
	cout << "Create()" << endl;
}
/*
 *test.cpp
 */
#include <iostream>
#include "class.h"
#include "HelloMFC.h"

using namespace std;

CMyApp myApp;

CMyApp *AfxGetApp()
{
	return myApp.m_CurrentApp;
}

int main()
{
	cout << "main start!" << endl;
	CMyApp *pApp = AfxGetApp();
	pApp->InitInstance();
	return 0;
}

我们按Ctrl+F5运行得到如图所示的结果,这样我们就能大体掌握其简化版的程序运行流程了,后续写代码该写到哪,怎么写就有思路了,同时对后续跟源码也有基础了;
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/85256022