MFC框架程序剖析
1.MFC
Microsoft Foundation Class,微软基础类库,是微软开发的C++集合,方便我们使用它来编写Windows程序。
下面是4个基本的类,我们的Visual C++程序基本都会有这4个类
2.MFC AppWizard
它是一个辅助我们生成源代码的工具,它可以帮助我们自动生成基于MFC的源代码,使我们可以定制自己的程序。
3.MFC中的WinMain函数
在MFC中找不到WinMain函数,因为MFC为我们封装了WinMain函数的调用,所以我们看不到,我们需要自己去跟踪程序的运行过程,只有这样我们才能完全理解程序的执行过程,不至于出错了,我们却不知道是什么原因。
4.基于MFC的程序框架剖析
MFC中的类都是以C字母开头的,继承的类结构可以在MSDN中查看,下面是CWnd的部分继承结构,这个类在MFC中非常重要,大家有必要了解。
5.MFC中的WinMain函数
在使用平台SDK的时候,我们是直接编写WinMain函数来启动程序的,但是在MFC中,这个框架已经将WinMain函数封装起来了,我们需要分析WinMain函数的调用过程,我们使用VS2013环境来分析。
(1).首先在AfxWinMain处打上断点,程序会运行到这里,下面是文件位置
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\appmodul.cpp
(2).在全局的theApp对象对象和其构造函数处打上断点,会发现程序先在这里运行这两个断点,最后运行上面的AfxWinMain断点,说明操作系统程序是先构造全局对象再调用WinMain函数,然后WinMain函数继续完成应用程序的初始化工作。
6.AfxWinMain函数
在MFC中Afx代表的是Application FrameWork 应用程序框架函数,也可以称为全局函数,这里分析几个重要的函数,文件的路径:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\winmain.cpp
AfxWinMain
7.InitInstance函数
这个函数在基类中是一个虚函数,在运行的时候会调用我们自己的app类的InitInstance函数
8.消息循环
在AfxWinMain函数中的CWinThread类的Run函数完成消息循环这个任务。
9.总结MFC的运行过程
(1).首先利用全局的theApp启动应用程序,使得CWinApp中的this指针指向这个对象。
(2).调用theApp全局对象的构造函数,从而就会先调用基类的构造函数来完成应用程序的一些初始化工作。
(3).进入WinMain函数,在AfxWinMain中获取我们自己类的app指针,利用这个指针调用InitInstance这个虚函数,基于多态的原理,在运行时调用的是我们子类自己实现的InitInstance函数
然后进行必要的初始化工作,包括窗口类的注册,创建,窗口的显示和更新,期间会多次调用
CreateEx函数,因为你如果创建的是MDI多文档程序就会创建多个窗口,例如框架窗口,工具条,状态条等。。。
(4).进入消息循环。虽然我们设置了默认的窗口的回调函数,但是MFC是采用消息映射的机制来处理各种消息的,当收到WM_QUIT消息的时候,退出消息,循环结束。
10.文档/视图类的结构
MFC提供了CDocment和CView两个类,组成了我们常用的MVC架构,下面就简要分析分析。
(1).思维导图
(2).Doc和View的联系
可以看出文档和视图是由对应关系的,具体的关系需要根据实际的项目自定义。
(3).文档模板的功能
可以看出文档模板主要功能就是完成MVC架构之间的联系和数据交换。
11.窗口类,窗口类对象与窗口之间的区别
很多人在开发的时候都会将他们相互混淆,这里就简要说明下:
C++窗口类对象与窗口并不相同,他们之间的唯一关系是通过C++窗口类对象内部定义的一个窗口句柄的变量,这个窗口句柄保存了与当前这个窗口类对象相关的窗口的句柄。当窗口销毁的时候,与之对应的C++窗口类对象并不一定销毁,但是这个窗口类对象内部的串口句柄不在指向之前的的那个窗口了,这取决于这个C++窗口类对象自己的生命周期的长短,但是需要注意的是当C++窗口对象销毁的时候,与之相关的窗口也会销毁。
12.Windows程序运行结构简图
一图胜千言
12.总结
下面是我自己总结的思维导图,做得不好,请大家多多指正,完整的还没有做好,做好了就分享给大家。
相关的资料大家可以下载:
https://yunpan.cn/cPVZYbZbi3eW2 访问密码 53e0