MFC学习-第2,3课 MFC框架的运行机制

本文深入探讨MFC AppWizard的工作原理,解析MFC程序框架,包括WinMain的隐藏、全局变量分配、CWinApp构造过程以及窗口类的注册和创建。文章详细阐述了MFC应用程序的生命周期,从WinMain入口到消息循环,再到文档视图结构的组织,揭示了MFC如何组织和管理应用程序。
摘要由CSDN通过智能技术生成
转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/

讲述MFC AppWizard的原理与MFC程序框架的剖析。AppWizard是一个源代码生成工具,是计算机辅助程序设计工具,WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWindow和OnCreate两个函数的着重分析,Windows窗口与C++中的CWnd类的关系。

1. 寻找WinMain入口:
在安装目录下找到MFC文件夹下的SRC文件夹,SRC下是MFC源代码。路径:Microsoft Visual Studio 10.0|VC|MFC|SRC|APPMODUL.CPP:
WinMain在APPMODUL.CPP中实现:

_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
//注意:(#define _tWinMain WinMain)

2. 对于全局对象或全局变量来说,在程序运行即WinMain函数加载的时候,已经为全局对象或全局变量分配了内存和赋初值。
所以:执行顺序为CTestApp theApp;(全局对象)->CTestApp ::CTestApp(){}(构造函数)->_tWinMain(){}(入口)
说明:每一个MFC程序,有且只有一个从WinApp类派生的类(应用程序类),也只有一个从应用程序类所实例化的对象,表示应用程序本身。在WIN32程序当中,表示应用程序是通过WinMain入口函数来表示的(通过一个应用程序的一个实例号这一个标识来表示的)。在基于MFC应用程序中,是通过产生一个应用程序对象,用它来唯一的表示了应用程序。

3. 通过构造应用程序对象过程中调用基类CWinApp的构造函数,在CWinApp的构造函数中对程序包括运行时一些初始化工作完成了。

CWinApp类在APPCORE.CPP中实现:
CWinApp::CWinApp(LPCTSTR lpszAppName){...}//带参数,而CTestApp构造函数没有显式向父类传参,难道CWinApp()有默认参数?见下:
//(在CWinApp类定义中, CWinApp(LPCTSTR lpszAppName = NULL); ) //注意:CWinApp()函数中: pThreadState->m_pCurrentWinThread = this; pModuleState->m_pCurrentWinApp = this //(this指向的是派生类CTestApp对象,即theApp)

对于this指针到底是属于基类的还是派生类的呢,在网站上搜索了一下:

参考:http://zhidao.baidu.com/link?url=qzkLuUebZqrSDHzNxG3e7ijc3P-RKCvH26dJtph60GL7GkrYI47ZNG4_YKtVnETCZW8Bi0YItpTw1oK-rMMrtq

运行顺序:CWinApp::CWinApp();->CTestApp theApp;->CTestApp ::CTestApp();->CWinApp::CWinApp();->CTestApp ::CTestApp();->_tWinMain(){}

4. _tWinMain函数中通过调用AfxWinMain()函数来完成它要完成的功能。(Afx*前缀代表这是应用程序框架函数,是一些全局函数,在每个类中都能被调用。应用程序框架是一套辅助生成应用程序的框架模型,把一些类做一些有机的集成,我们可根据这些类函数来设计自己的应用程序)。
AfxWinMain()函数在WINMAIN.CPP中:
在AfxWinMain()函数中:

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    _In_ LPTSTR lpCmdLine, int nCmdShow)
{
    ASSERT(hPrevInstance == NULL);

    int nReturnCode = -1;
    CWinThread* pThread = AfxGetThread();
    // 说明:pApp存储的是指向WinApp派生类对象(theApp)的指针。
// AfxGetApp()函数的定义
// _AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
// { return afxCurrentWinApp; }
// #define afxCurrentWinApp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值