孙鑫C++教程学习记录

来源:互联网 发布:python安装后怎么用 编辑:程序博客网 时间:2024/06/10 11:44

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

学习MFC既讲操作又讲原理

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


第3章 


_tWinMain的宏定义:



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

一般应用程序:


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

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


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


上面源自CTestApp的源文件

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


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

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

搜索CWinApp:APPCORE.CPP


双击打开:


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


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

 

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

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


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

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


找到文件:WINMAIN.CPP



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

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


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


InitApplication()是窗口内存管理!

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


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

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

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


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

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




调试运行顺序:

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

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







第八个问题:

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


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

搜索CFrameWnd::PreCreateWindow如下:





搜索:AfxDeferRegisterClass




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

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

创建窗口:


搜索:




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



显示和更新窗口:



消息循环:




在本文档查找:PumpMessage()





01:20:35

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



























原创粉丝点击