热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WindowsMFC框架程序剖析

MFC框架程序剖析1.MFCMicrosoftFoundationClass,微软基础类库,是微软开发的C++集合,方便我们使用它来编写Windows程序。下面是4个基本的类

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

Windows-MFC框架程序剖析


推荐阅读
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 网络爬虫的规范与限制
    本文探讨了网络爬虫引发的问题及其解决方案,重点介绍了Robots协议的作用和使用方法,旨在为网络爬虫的合理使用提供指导。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 第七卷《英才》强调,即使有良药,若不对症,效果也不如低等药物;即使有贤才,若不适用,效果也不如普通人。文中通过多个比喻,阐述了人才使用的重要性,指出合适的人才在适当的时间和场合才能发挥最大效用。 ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
author-avatar
牧羊人2602903895
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有