孙鑫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
在原有的窗口基础上添加一个按钮!
- 孙鑫C++教程学习记录
- git学习教程记录
- C 学习记录 出错记录
- C指针学习记录
- C语言学习记录
- Objective-C 学习记录
- c 学习记录 一
- c 指针学习记录
- Objective-C 学习记录
- C语言学习记录
- c学习记录
- C语言学习记录
- Objective-C学习记录
- C语言学习记录
- 学习记录 c/c++
- c学习记录
- C/C++学习记录
- C语言学习教程
- 对字符串的处理sizeof()/strlen
- http 协议
- 234.Palindrome Linked List
- 怎么进行面向对象设计(二)
- OpenCV + CentOS开发环境搭建
- 孙鑫C++教程学习记录
- Android工程师之Android面试大纲
- 2017年千禧一代奢侈品用户购买行为分析
- Friend-Graph---枚举
- C#/.Net
- android.mk中引用第三方库的方法
- Java中使用Jedis操作Redis
- HDU 4787GRE Words Revenge
- 五星评价