MFC框架程序解析

这篇具有很好参考价值的文章主要介绍了MFC框架程序解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

MFC(Microsoft Foundation Class,微软基础类库)是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,以类的方式提供给用户使用。利用这些类,可以有效地帮助程序员完成Windows应用程序的开发。

即MFC是一个封装库, 该库封装了 Windows程序运行机制 一文中手动设计、注册、创建、显示刷新、进入消息循环等代码实现,使得开发人员开发Windows程序更加方便简洁。

MFC框架解析

这里使用VS2019新创建一个单文档MFC程序, 如下:
MFC框架程序解析
MFC框架程序解析
这里创建了一个基于 单个文档 类型, 样式是MFC Standard 的MFC程序, 创建后可以看到VS2019自动创建了以下5个类:
MFC框架程序解析
在MFC中,类的命名都以字母“C”开头, 对于一个单文档应用程序(即我们在创建项目时第二步应用程序类型中选择的“单个文档”),都有一个CMainFrame类、一个以**“C+项目名+App”为名字的类(例CSingleDocMFCApp)、一个以“C+项目名+Doc”为名字的类(例CSingleDocMFCDoc)和一个以“C+项目名+View”**为名字的类(例CSingleDocMFCView)。

这里可以直接编译运行生成一个窗口:
MFC框架程序解析
和之前的Windows程序相比,这里新建项目后并没有手动的进行一般Windows程序的开发步骤,即设计、注册、创建、显示刷新、消息循环等步骤开发,但运行后依旧创建显示了一个窗口,因为创建项目后自动生成了几个类, 因此这里就会认为是MFC这个库在创建项目后自动给我们完成了设计、注册、创建、显示刷新、消息循环等步骤。

但通过全局搜索几个自动创建的类发现,并没有Windows程序的入口函数,即WinMain。

我们之所以看不见这些,是因为微软在MFC的底层框架类中封装了这些每一个窗口应用程序都需要的步骤,目的主要是为了简化程序员的开发工作,但这也给我们在学习和掌握MFC程序时造成了很多不必要的困扰。

入口点函数WinMain

这里可以在VS安装目录下的MFC的源码文件appmodul.cpp中找到WinMain, 例我安装在D盘,右键用vs2019打开:
MFC框架程序解析
可以看到WinMain函数,重新编译运行,可以看到会运行到断点的WinMain函数中:
MFC框架程序解析
这里的问题是,如何通过MFC框架自动创建的代码进入到WinMain的?
其实每个MFC程序,都会有一个唯一的全局的应用程序对象,如下:
MFC框架程序解析
初始化该对象时,首先递归调用CSingleDocMFCApp的父类的构造函数,而CSingleDocMFCApp继承自CWinApp,因此这里我们断点到CWinApp构造函数中,发现确实如此:
MFC框架程序解析
m_pCurrentWinThread对象的类型是CWinThread,该类是CWinApp的父类。根据C++继承机制,可以确定这个this对象代表的是子类CTestApp的对象,即theApp。这会在后面的WinMain中引用。

当程序调用了CWinApp类的构造函数,并执行了CTestApp类的构造函数,且产生了theApp 对象之后,接下来就进入 WinMain 函数。

回到之前的WinMain函数中,发现里面只调用了一个AfxWinMain, 在MFC程序中, 以Afx开头的都是全局函数,该函数在winmain.cpp中实现:
MFC框架程序解析
断点①:调用pApp->InitApplilcation(), 这里的pApp指向的就是唯一的全局对象(在上面的CWinApp构造中断点部分指定),该函数完成MFC内部管理方面的工作。

断点②:调用pThread->InitInstance(), 这里的pThread同理也在上面CWinApp中的断点部分指定,因此会调用CSingleDocMFCApp::InitApplication(),在该函数中会构建MFC核心的Doc/View结构:
MFC框架程序解析
其中会CMainFrame的构造中完成窗口的设计、注册、创建、显示刷新,这里会在其创建之前调用CMainFrame::PreCreateWindow, 在该函数内又会调用其父类的版本CFrameWnd::PreCreateWindow, 会在该接口中完成窗口的注册。

因篇幅有限不再深入讲解,可参考上述步骤找到对应代码断点验证。

断点③:pThread->Run(), 即该应用程序(theApp)的消息循环。

至此,可以看到在没有手动添加代码的情况下,使用MFC向导生成的代码,便可代替此前 Windows程序运行机制 一文中的设计、注册、创建、显示刷新、进入消息循环等步骤。

总结

最后,在总结下MFC框架创建窗口的整体过程:
■ 首先利用全局应用程序对象theApp 启动应用程序。正是产生了这个全局对象,基类CWinApp中的this指针才能指向这个对象。如果
没有这个全局对象,则程序在编译时不会出错,但在运行时就会出错。
■ 调用全局应用程序对象的构造函数,从而就会先调用其基类CWinApp的构造函数。后者完成应用程序的一些初始化工作,并将应用
程序对象的指针保存起来。
■ 进入WinMain函数。在AfxWinMain函数中可以获取子类(即唯一的全局对象theApp)的指针,利用此指针调用虚函数:InitInstance,根据多态性原理,实际上调用的是子类(CSingleDocMFCApp)的 InitInstance 函数。后者完成应用程序的一些初始化工作,包括窗口类的注册、创建,窗口的显示和更新。
■ 进入消息循环。虽然也设置了默认的窗口过程函数,但是,MFC 应用程序实际上是采用消息映射机制来处理各种消息的。当收到
WM_QUIT 消息时,退出消息循环,程序结束。

可以看到窗口的创建虽然都由MFC框架处理,但其实现原理依旧和Windows程序一样,即设计、注册、创建、显示刷新、进入消息循环这一步骤。

优点就是前面提到的简化程序员的开发工作,但可以明显感觉到MFC框架对Windows系统的依赖性,这就限制了其对跨平台的支持。文章来源地址https://www.toymoban.com/news/detail-454058.html

到了这里,关于MFC框架程序解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超越传统:深入比较Bootstrap、Foundation、Bulma、Tailwind CSS和Semantic UI的顶级CSS框架!

    在Web开发中,选择适合项目需求的CSS框架可以极大地简化界面设计和响应式布局的工作。本文将详细介绍一些流行的CSS框架,并提供代码示例和比较,以帮助您做出明智的选择。 Bootstrap是最受欢迎和广泛使用的CSS框架之一。它提供了丰富的预定义样式和组件,适用于快速构建

    2024年02月16日
    浏览(84)
  • 【MFC】01.MFC框架-笔记

    MFC Microsoft Fundation class 微软基础类库 框架 基于Win32 SDK进行的封装 属性:缓解库关闭 属性-C/C++/代码生成/运行库/MTD 属性-常规-MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库 SDK版本:开发软件的套件 WSK:开发驱动的套件 MFC基于类的管理 预编译头: Demo01.h

    2024年02月14日
    浏览(36)
  • 找不到mfc140u.dll或者Microsoft Visual C++ 2017 Redistributable一直安装失败解决

    安装后提示这个问题,我将xshell卸载重新安装后发现安装过程中提示Microsoft Visual C++ 2017 Redistributable一直安装失败,所以问题出在Microsoft Visual C++ 2017 Redistributable上 首先查看日志文件 说明有更高的版本 控制面板–》卸载程序 发现比自己版本高的,卸载掉 下载Microsoft Visual C

    2024年02月12日
    浏览(52)
  • mfc140.dll丢失的解决方法,解析mfc140.dll这个文件

    其实大部分人在使用计算机过程中,您可能会遇到mfc140.dll丢失的错误提示。这个错误会导致一些应用程序无法正常运行,那么要如何解决这个问题呢?今天小编就来给大家详细的解析mfc140.dll这个文件以及教大家 mfc140.dll丢失的解决方法。 目录 一. mfc140.dll是什么文件 二. mf

    2024年02月09日
    浏览(55)
  • mfc110.dll丢失是什么意思?全面解析mfc110.dll丢失的解决方法

    在使用计算机的过程中,用户可能会遭遇一个常见的困扰,即系统提示无法找到mfc110.dll文件。这个动态链接库文件(DLL)是Microsoft Foundation Classes(MFC)库的重要组成部分,对于许多基于Windows的应用程序运行至关重要。当计算机系统或应用程序在运行时无法定位到mfc110.dll文件

    2024年01月21日
    浏览(49)
  • 6. 成功解决:Driver class ‘com.microsoft.sqlserver.jdbc.SQLServerDriver‘ could not be found

    ❤️ 个人主页:水滴技术 🌸 订阅专栏:成功解决 BUG 合集 🚀 支持水滴: 点赞 👍 + 收藏 ⭐ + 留言 💬 在使用 Kettle(Spoon) 工具创建 SQL Server 数据库连接时,提示: 该提示的意思是缺少 SQL Server 相关的 JDBC 驱动。 Kettle 并工具并没有为所有的数据库提供 JDBC 驱动,需要自行下

    2024年02月03日
    浏览(48)
  • MFC中的类继承图的基本框架

    一、类继承关系 从图中可知,在MFC中大多数的类都派生于CObject类,它的主要作用是为子类提供一些基本的功能,这些派生类构成了MFC应用程序的基本框架,它们各自的功能描述如表1所示。 派生类 功能描述 CCmdTarget 用于处理用户请求 CWinThread 代表应用程序内部的执行线程

    2024年02月09日
    浏览(39)
  • 【JVM学习】Class文件解析

    最近为了加深对于JAVA的理解,在复习JVM,这里面的内容大部分都是比较确定的、文档性质的内容,目前并没有特别的总结。但是看到类文件结构,手痒,想写了个解析文件的解析器,那就简单记录下吧。 详细内容不记了,太多了,有兴趣的同学看虚拟机相关书籍了解,这里

    2023年04月13日
    浏览(90)
  • MFC发送http https以及json解析

    请求三部曲:

    2024年02月05日
    浏览(45)
  • 【实战】CEF框架集成MFC DLL的一些坑

    MFC作为微软的长期主力开发套件之一,之前很多设备开发的C/S端界面都是通过MFC框架来做的,而在我自己的CEF项目中,会集成很多之前的DLL来完成设备驱动和开发。所以,在CEF项目开发中,肯定会碰到一些和原有的MFC代码集成的工作。 最近收集了几个在集成工作中的坑,自己

    2024年02月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包