MFC程序执行过程深入剖析

 更新时间:2020年4月25日 17:41  点击:1423

本文较为详细的分析了VC++程序设计的MFC程序执行过程,有助于加深对MFC程序运行原理的理解。分享给大家供大家参考之用。具体分析如下:

一 MFC程序执行过程剖析

1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数。而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象。CWinApp类被称之为应用程序对象,在一个MFC程序当中只允许有一个应用程序对象。由于CWinApp的派生对象是全局的,因此这个对象的构造函数会在所有的其他代码运行之前被调用,而由于CWinApp类当中包含了HWND、HINSTANCE等句柄的存在,其构造函数就执行了对这些成员数据的初始化操作,这里的所谓初始化仅仅是把所有的句柄对象赋值为NULL。

2)在调用完CWinApp的构造函数以后由连接器向程序内自动链接的AfxWinMain函数将被调用,而这个函数可以被看作MFC程序的入口函数。在这个函数当中调用全局AfxGetApp()函数获得应用程序对象,这时将调用AfxInit全局函数,这个函数的功能是使用操作系统传递给AfxWinMain函数的参数初始化应用程序对象当中的相关句柄数据成员。

3)之后AfxWinMain函数调用CWinApp::InitApplication成员函数,这个成员函数用来初始化应用程序对象当中的关于文档部分的内容。

4)随后调用CWinApp::InitInstance成员函数,在这个成员函数当中,使用new操作在堆上声明一个框架窗口对象,由此导致框架窗口对象的构造函数被调用,在框架窗口构造函数当中调用Create函数来创建窗口,而调用的Create函数一般将WNDCLASS参数设置成NULL,这样就由MFC内部调用PreCreateWindow函数,在这个函数当中由MFC注册几个默认的WNDCLASS供框架窗口的Create使用。这时程序控制权交还给CWinApp::InitInstance成员函数内部,由这个函数调用CWnd::ShowWindow显示窗口并且调用CWnd::UpdateWindow向窗口发送WM_PAINT消息。调用完CWinApp::InitInstance成员函数后由AfxWinMain函数调用CWinApp::Run成员函数,并由这个函数来创建和处理消息循环,并且在没有消息的时候处理OnIdle空闲处理。至此整个程序的创建过程完成。

5)在程序的运行过程当中,由操作系统源源不断的发送消息给应用程序,并且由CWinApp::Run当中的消息循环处理并且分发给相关的窗口对象的DefWindowProc成员函数,并由这个成员函数查询窗口对象的消息映射表,如果查到对应项,则由登记在消息映射表当中的类成员函数处理,否则则按照Message Route当中的顺序象父层类发送。

6)在消息运行结束,用户按下关闭按钮后,操作系统向程序发送WM_CLOSE消息,默认状况下程序调用DestoryWindow并且发送WM_DESTORY消息,应用程序接受到这个消息以后的默认操作是调用PostQuitMessage函数,由这个函数发送WM_QUIT消息。当程序对象接受到WM_QUIT消息后消息循环结束,由AfxWinMain函数调用AfxTerm函数清理程序使用过的资源并且结束整个程序。

小结:以上的所有描述涵盖了一个程序从开始、运行到结束的所有过程。 相信大家有点晕点了吧,实际编程中没有必要深刻理解这么多,这些大都是由MFC内部自动帮我们完成的。实际MFC编程过程中,其实懂得MFC程序中各个函数的执行流程即可。有时候过于追究MFC细节会白白浪费我们的精力,应该将主要精力放在使用MFC解决实际问题上。

二 VC6中SDI程序的执行流程

下面以VC6中的sdi工程为例,通过给每个函数前设置断点后调式执行,可以看出MFC的SDI的执行流程。记录如下,希望对MFC执行有疑惑的人有帮助。

1)CSdiApp theApp;          //sdi.cpp
2)CSdiApp::CSdiApp()             //sdi.cpp
3)BOOL CSdiApp::InitInstance()         //sdi.cpp
4)CSdiDoc::CSdiDoc()                   //sdiDoc.cpp
5)CMainFrame::CMainFrame()          //MainFrm.cpp
6)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)    //MainFrm.cpp
7)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)    //MainFrm.cpp
8)CSdiView::CSdiView()                     //sdiView.cpp
9)BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs)         //sdiView.cpp
10)BOOL CSdiDoc::OnNewDocument()                //sdiDoc.cpp
11) void CSdiView::OnDraw(CDC* pDC)                //sdiView.cpp
// ---------------- 关闭窗口后-------------------------------------
12) CSdiView::~CSdiView()
13) CMainFrame::~CMainFrame()
14) CSdiDoc::~CSdiDoc()

感兴趣的朋友可以采用断点调试测试一下SDI程序的执行流程,以加深对MFC运行原理的理解,从而更好的掌握Windows程序设计。

[!--infotagslink--]

相关文章

  • 新旧MFC版本实现CEdit透明的2种方法的实例代码

    新旧MFC版本实现CEdit透明的2种方法的实例代码,需要的朋友可以参考一下...2020-04-25
  • MFC实现连连看游戏之消子算法

    这篇文章主要为大家详细介绍了MFC实现连连看游戏之消子算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • MFC实现全屏功能代码实例

    这篇文章主要介绍了MFC实现全屏功能的代码,对于学习MFC有一定的借鉴价值,需要的朋友可以参考下...2020-04-25
  • VS2019以及MFC的安装详细教程

    这篇文章主要为大家详细介绍了VS2019以及MFC的安装教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • MFC控件之CListCtrl的应用实例教程

    这篇文章主要介绍了MFC控件中CListCtrl的应用方法,包括了针对表格的一些操作,是MFC中比较重要的一个控件类,需要的朋友可以参考下...2020-04-25
  • MFC之ComboBox控件用法实例教程

    这篇文章主要介绍了MFC之ComboBox控件用法,包括了ComboBox控件常见的各类用法,非常具有实用价值,需要的朋友可以参考下...2020-04-25
  • C++中MFC Tab Control控件的使用详解

    这篇文章主要介绍了C++中MFC Tab Control控件的使用详解的相关资料,需要的朋友可以参考下...2020-04-25
  • C++ 关于MFC多线程编程的注意事项

    这篇文章主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下...2020-04-25
  • MFC创建右键弹出菜单的方法

    这篇文章主要介绍了MFC创建右键弹出菜单的方法,较为详细的分析了创建菜单资源及视类添加WM_RBUTTONDOWN消息的实现方法,是非常实用的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • 构建mfc窗体的简单示例

    这篇文章主要介绍了构建mfc窗体的简单示例,需要的朋友可以参考下...2020-04-25
  • MFC自绘Button按钮分析和实现

    这篇文章主要为大家详细介绍了MFC自绘Button按钮分析和实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • C语言MFC基础之计算器详解

    这篇文章主要为大家介绍了MFC实现简单的计算器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...2021-08-31
  • MFC设置对话框焦点的方法简述

    这篇文章主要介绍了MFC设置对话框焦点的方法简述,主要讲述了两种实现方法,需要的朋友可以参考下...2020-04-25
  • mfc入门教程之通过控制变量制作计算器

    这篇文章主要介绍了mfc入门教程之通过控制变量制作计算器,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-04-25
  • MFC命名规则汇总

    这篇文章主要介绍了MFC命名规则,对于初学者而言需要牢固掌握这类规则,需要的朋友可以参考下...2020-04-25
  • MFC绘制不规则窗体的方法

    这篇文章主要介绍了MFC绘制不规则窗体的方法,涉及MFC窗体操作的相关技巧,需要的朋友可以参考下...2020-04-25
  • MFC扩展DLL中导出类和对话框的实现方法

    这篇文章主要介绍了MFC扩展DLL中导出类和对话框的实现方法,详细讲述了实现扩展DLL中导出类和对话框的具体步骤与方法,具有不错的实用价值,需要的朋友可以参考下...2020-04-25
  • mfc文件操作CFile类之创建文件的方法

    这篇文章主要介绍了mfc文件操作CFile类之创建文件的方法,需要的朋友可以参考下...2020-04-25
  • MFC串口通信发送16进制数据的方法

    这篇文章主要为大家详细介绍了MFC串口通信发送16进制数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • vs2019 MFC实现office界面的画图小项目

    本文主要介绍了vs2019 MFC实现office界面的画图小项目,对大家入门有一定的帮助,需要的朋友们下面随着小编来一起学习学习吧...2021-06-07