mfc内部结构剖析图
更新时间:2024-03-22 03:01:01 阅读量: 综合文库 文档下载
MFC程序的执行顺序依次是:theApp全局对象定义处、TestApp构造函数、WinMain。 程序在加载main函数之前,会先为全局变量和全局对象分配内存空间。
对于MFC程序来说,通过产生一个应用程序类的对象来唯一标识应用程序的实例。每一个MFC程序实例有且仅有一个该派生类的实例化对象,也就是theApp全局对象,该对象就表示了应用程序本身。
theApp对象的构造函数CtestApp在调用之前,会调用其父类CWinApp的构造函数,从而就把我们程序自己创建的类与Microsoft提供的基类关联起来了。CWinApp的构造函数完成程序运行时的一些初始化工作。
AfxWinMain函数:WinMain函数实际上是通过调用AfxWinMain函数来完成它的功能的。 AfxWinMain调用AfxGetThread函数获得一个CWinTread类型的指针。 接着AfxWinMain调用AfxGetApp函数获得一个CWinApp类型的指针。
由以下代码可以看出:AfxGetThread函数返回的就是AfxGetApp函数的结果。 CWinThread* AFXAPI AfxGetThread() {
// check for current thread in module thread state
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState(); CWinThread* pThread = pState->m_pCurrentWinThread;
// if no CWinThread for the module, then use the global app if (pThread == NULL)
pThread = AfxGetApp(); return pThread; }
因此,AfxWinMain函数中的pThread和pApp这两个指针是一致的。
AfxGetApp函数返回的是在CWinApp构造函数中保存的this指针(详见CWinApp类定义的源文件:appcore.cpp)。
对本Test程序来说,这个this指针实际上指向的是CTestApp的对象:theApp。也就是说,pThread和pApp所指向的都是CTestApp类的对象,即theApp全局对象。
InitInstance函数:
pThread和pApp调用了三个函数(InitApplication、InitInstance和Run)去完成Win32程序所需要的几个步骤:设计窗口类、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环以及窗口过程函数。
pApp首先调用InitApplication函数完成MFC内部管理方面的工作。
接着,调用pThread的InitInstance函数(其实是调用从CWinApp派生的应用程序类CTestApp中的虚函数InitInstance)。
MFC框架窗口
1.设计和注册窗口:MFC已经为我们预定义了一些默认的标准窗口类,只需呀选择所需的窗口类,然后注册就可以了。
窗口类的注册由AfxEndDeferRegisterClass函数完成(AfxEndDeferRegisterClass函数首
先判断窗口类的类型,然后赋予其相应的类名,这些类名是MFC预定义的,然后调用AfxRegisterClass函数注册窗口类)。
AfxRegisterClass函数首先获得窗口类的信息,如果该窗口已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类(注册窗口类使用的函数其实和Win32 SDK编程中所使用的函数一致)。
我们所创建的这个MFC应用程序Test,实际上有两个窗口。
其中之一:CMainFrame::PreCreateWindow,这是在窗口产生之前被调用的。CMainFrame::PreCreateWindow函数又调用了AfxDeferRegisterClass,而
AfxDeferRegisterClass实际上是一个宏,指向AfxEndDeferRegisterClass(前面提到,此函数的功能就是注册窗口类)。
2.创建窗口:
窗口的创建是由CWnd类的CreateEx函数实现的。(声明:AFXWin.h实现:WINCORE.CPP) (在MFC的底层代码中CFrameWnd::Create调用了上述的CreateEx函数,而
CFrameWnd::LoadFrame又调用CFrameWnd::Create函数。此过程请自行跟踪。)
CWnd::CreateEx调用CMainFrame::PreCreateWindow(PreCreateWindow是一个虚函数,所以这里实际上调用的是子类,即CMainFrame::PreCreateWindow。这里再次调用此函数是为了在产生窗口之前让程序员有机会修改程序的外观。例如,去掉窗口最大化按钮等)
3.显示和更新窗口
CTestApp::m_pMainWnd
m_pMainWnd是一个CWnd类型并且保存了应用程序框架窗口对象的指针,也就是说m_pMainWnd变量是一个指向CMainFrame对象的指针。 CTestApp::InitInstance函数实现内部有如下两行代码: m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();
这两行代码实现了窗口的显示和更新。
消息循环
CWinThread::Run函数完成消息循环。
该函数由AfxWinMain::pThread函数调用。 形式:pThread->Run();
CWinThread::Run函数主要是一个for循环,该循环在收到一个WM_QUIT消息时退出。在此循环中调用了一个PumpMessage函数。
窗口过程函数
AfxEndDeferRegisterClass函数源程序:wndcls.lpfnWndProc = DefWindowProc 这里指定的一个默认窗口过程DefWindowProc。但实际上MFC程序并不是把所有的消息都交给DefWindowProc这一默认窗口过程来处理。而是采用了一种“消息映射机制”。
/////////////////////////////////////////////////////////////////////////////////////////// 梳理全过程
1.首先利用全局应用程序对象theApp启动应用程序。正是产生了这个全局对象,基类CWinApp中的this指针才能指向这个对象。如果没有这个全局对象,程序在编译的时候不会出错,但在运行时就出错。
2.调用全局应用程序对象的构造函数,从而就会先调用其基类CWinApp的构造函数。后者完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来。 3.进入WinMain函数。在AfxWinMain函数中可以获取子类(对Test程序来说,就是CTestApp类)的指针,利用此指针调用虚函数:InitInstance,根据多态性原理,实际上调用的是子类(CTestApp)的InitInstance函数。后者完成一些应用程序的初始化工作,包括窗口类的注册、创建,窗口的显示和更新。期间会多次调用CreateEx函数,因为一个单文档MFC应用程序有多个窗口,包括框架窗口、工具条、状态条等。
4.进入消息循环。虽然也设置了默认的窗口过程函数,但是,MFC应用程序实际上采用消息影射机制来处理各种消息的。当收到WM_QUIT消息时,退出消息循环,程序结束。
///////////////////////////////////////////////////////////////////////////////////////////
正在阅读:
mfc内部结构剖析图03-22
对口二年级-教育活动设计期中试卷09-29
社会心理学论文—人际关系04-04
优秀小学生代表发言稿大全(共5则)08-22
新15届高三市一模考场佳作汇编01-30
铁塔室分项目建议书12-09
国际单位制及其应用05-21
古诗复习09-18
亚美建工公司DCS系统应急预案11-07
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 剖析
- 内部
- 结构
- mfc
- 民营医院员工手册
- 游泳管理须知
- 《北师大版小学一年级数学第一学期期末试卷》
- 元旦作业
- 《只有CEO才能做的事》案例分析
- 四川省普通国省干线公路大中修工程设计文件编制指南
- 教你怎么吃资料
- 试论高考语文各种题型抓分技巧
- 2015-2020年中国小型柴油发动机市场监测报告 - 图文
- 卫生事业管理学模拟试题
- 2018-2024年中国黑色金属冶炼市场全景调查与投资战略研究报告(
- 北京大学私募五班总裁班通讯录
- 第三单元 第二章 被子植物的一生
- 起重机械(综合)培训资料
- GSP自查表 - 图文
- 屈臣氏里销量最好的面膜 - 护肤必备知识
- 2017-2018学年长春版小学六年级语文下册期末毕业测试卷
- 实验五-在Packet tracer仿真环境下组建三层网络-实验指导书
- 华旭考前冲刺班行政法-徐金桂讲义(1)
- 南瓜花黄酮超声波辅助提取工艺的研究