MFC程序初始化

来源:互联网 发布:pc助手91苹果优化软件 编辑:程序博客网 时间:2024/05/29 08:30

为了更好的理解MFC程序的初始化过程,我们还是先模拟MFC程序开始,第一步先创建一个简单的WIN32程序,将他的头文件改成afxwin.h(它包含afx.h以及windows.h)。第二步在工程-设置中将他的基础库改成使用MFC作为静态库。第三步去掉WINmain函数。这中改程序的方法在我们的对话框的时候使用过。

因为要模仿程序初始化,所以一个基本的程序是要有的。现在我们要模仿MFC单文档构架程序,所以与对话框程序中所继承的父类可能就不一样了首先是CFrameWnd(框架窗口类),此类负责管理框架窗口。然后是CWinAPP(应用程序类)负责管理整个程序的流程,单文档构架还有其他的类,但今天他们没什么用,所以就不一一介绍了。然后在CWinApp子类中重载InitInstance函数,为了方便跟踪代码,在CwinApp的子类中显示添加无参构造函数,一切准备完毕,最后定义一个CWinApp子类的全局对象theApp,这个称为程序的爆破点,因为有了它,一个MFC程序才算是真正的活了起来。

程序运行到全局变量theApp的定义,然后对其进行初始化,初始化会进入本来相对应的构造函数,开始写的那个构造就起作用了,不然你就会在这个跟飞了。因为父类的初始化发生在子类的前面,因此这里会调用父类的构造函数,在这里进行一些简单的初始化工作,最主要的是把theApp的地址保存到AFX_MODULE_STATE(当前模块状态信息)以及AFX_MODOLE_THREAD_STATE(当前程序线程状态信息)对象的成员中。他们之间的关系如下:AFX_MODULE_STATE的m_thread中是AFX_MODOLE_THREAD_STATE对象地址,而m_pCurrentWinApp中保存了theApp的地址。AFX_MODOLE_THREAD_STATE的m_pCurrentWinThread中保存了theApp的地址。

MFC的窗口创建过程,说到创建过程,先要找到程序的WinMain函数然后再找到我们Win32中用到的相关注册创建函数,当然这是我们的基本思路,到底MFC是怎么实现的!在这里我们暂时是不知道的。找WinMain函数之前我们要先介绍一个好的工具就是callstack,可以看到各种函数的调用关系,它在VC的查看-调试窗口里面。上面的我们在CWinApp的子类中重载了一个虚函数,那么肯定会在某个时刻被调用的,所以先在这个函数里下个断点,然后调试运行,停在了断点处,利用callstack查看函数调用关系。果然WinMain函数函数就在那里,双击WinMain这样就到了WinMain函数里面了。在这个函数下个断点结束本次调试,这样WinMain函数就找到了。那么今天的事也就到这了,下面是今天的主要代码:

class CMyFrameWnd:public CFrameWnd{};class CMyWinApp:public CWinApp{public:     CMyWinApp(){}public:virtual BOOL InitInstance();};CMyWinApp theApp;BOOL CMyWinApp::InitInstance(){    return TRUE;}


0 0
原创粉丝点击