第一章 Windows程序内部运行机制

学习MFC既讲操作又讲原理

为了熟练掌握Windows应用程序的开发,需要理解Windows平台下程序运行的内部机制(本章将深入剖析Windows程序内部运行机制)。


第3章 


_tWinMain的宏定义:

孙鑫C++教程学习记录

孙鑫C++教程学习记录

第一个问题:运行,先调用CTestApp(先声明,后类构造函数),后WinMain。为什么呢?解释如下:

一般应用程序:

孙鑫C++教程学习记录

进入main函数之前,全局变量已经被分配初始化了!

类定义和类对象声明如下,调试运行观察顺序:

孙鑫C++教程学习记录

先是类定义处,后类构造函数,最后main函数(执行之前,分配内存空间!)

孙鑫C++教程学习记录

上面源自CTestApp的源文件

第二个问题:为什么定义全局变量theApp?唯一表示应用程序

孙鑫C++教程学习记录

上面文件源自于:CTestApp的头文件中!

子类CTestApp派生自自父类CWinApp,子类构造函数在调用之前先调用父类,CWinApp构造函数的调用,它们是微软提供给我们的,派生类和MFC基类关联起来了!在子类CTestApp的初始化就在CWinApp构造函数中完成了。通过这种方式,父类和基类关联!

搜索CWinApp:APPCORE.CPP

孙鑫C++教程学习记录

双击打开:

孙鑫C++教程学习记录

第三个问题:父类构造函数带参,子类定义时构造函数为什么没有参数?参数缺省,构造时候不用传递参数!

孙鑫C++教程学习记录

上面是CWinApp的构造函数,冒号两边名字完全一样!查看定义如下:

 孙鑫C++教程学习记录

上面是CWinApp类的定义,参数缺省值!

第四个问题:this指针指向哪一个对象?CTestApp还是CWinApp对象?继承性原理:CTestApp的对象:theApp。可以调试看看!

孙鑫C++教程学习记录

基类初始化完,派生类也初始化完,内存有空间,就是WinMain函数!

查找:AfxWinMain,是继承很多类的框架模型,根据方案设计自己的application frame

孙鑫C++教程学习记录

找到文件:WINMAIN.CPP

孙鑫C++教程学习记录


笔记转移到《VC++深入详解》……

第五个问题:下图黄色划线部分指针指向?

孙鑫C++教程学习记录

上面两个指针指向的都是子类theApp的指针!

孙鑫C++教程学习记录

InitApplication()是窗口内存管理!

pThread->Initinstance()其实调用的就是下面的:

孙鑫C++教程学习记录

之后的是:nReturnCode = pThread->Run()消息的循环运行!

通过设置断点来查看运行顺序和过程:

声明子类—>基类构造函数—>子类构造函数—>WinMain—>AfxWinMain—>InitApplication()—>pThread->Initinstance()—>Bool CTestApp::InitInstance()


第六个问题:注册窗口是在哪里?

查找如下:(现在可以想一下,其实吧,作者研究思路:按照第一章思路,那些函数,按照执行顺序,按照如下搜索方法,一步一步寻找第一章的思路,设置断掉调试运行来验证!)

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

调试运行顺序:

声明子类—>基类构造函数—>子类构造函数—>WinMain—>AfxWinMain—>InitApplication()—>pThread->Initinstance()—>Bool CTestApp::InitInstance()—>AfxEndDeferRegisterClass

第七个问题:关于Frame Windows和CView

孙鑫C++教程学习记录
孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录


第八个问题:

执行顺序:声明子类—>基类构造函数—>子类构造函数—>WinMain—>AfxWinMain—>InitApplication()—>pThread->Initinstance()—>Bool CTestApp::InitInstance()—>AfxEndDeferRegisterClass—>CMainFrame::PreCreateWindow

孙鑫C++教程学习记录

为什么要先调用:CFrameWnd::PreCreateWindow??

搜索CFrameWnd::PreCreateWindow如下:

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

搜索:AfxDeferRegisterClass

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

先注册后Precreatwindow是由于:单文档!正常是先precreatwindow后注册!!

执行顺序:执行顺序:声明子类—>基类构造函数—>子类构造函数—>WinMain—>AfxWinMain—>InitApplication()—>pThread->Initinstance()—>Bool CTestApp::InitInstance()—>AfxEndDeferRegisterClass—>CMainFrame::PreCreateWindow—>CFrameWnd::Create—>CWnd::CreateEx——>PreCreateWindow

创建窗口:

孙鑫C++教程学习记录

搜索:

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

CREATESTRUCT结构体:有机会修改窗口!如下参数

孙鑫C++教程学习记录


显示和更新窗口:

孙鑫C++教程学习记录


消息循环:

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

在本文档查找:PumpMessage()

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

孙鑫C++教程学习记录

01:20:35

在原有的窗口基础上添加一个按钮!



























相关文章: