深入浅出MFC——MFC程序的生死因果(三)
1. 本章主要目的:从MFC程序代码中检验出一个Windows程序原本该有的程序进入点(WinMain)、窗口类注册(RegisterClass)、窗口产生(CreateWindow)、消息循环(Message Loop)、窗口函数(Window Procedure)等等操作。抽丝剥茧,彻底理解一个MFC程序的诞生与结束,以及生命过程。


2. 熟记MFC类的层次结构:
3. CWinApp和CFrameWnd:



(1)CWinApp(AFXWIN.H中声明)——取代WinMain的地位。
注:CWinApp记录主窗口的handle(或是主窗口对应之C++对象)——m_pMainWnd已经被移往CWinThread中了(它是CWinApp的父类)(AFXWIN.H)。
(2)CFrameWnd——取代WndProc的地位:CFrameWnd主要用来掌握一个窗口。


4. Application object:在CWinApp派生类(如CMyWinApp类)中定义的全局变量(如theApp)。




5. AfxWinInit——AFX内部初始化操作(APPINIT.CPP和THRDCORE.CPP,跟踪源码):
6. CWinApp::InitApplication :程序本体执行一次。
7. CMyWinApp::InitInstance:每一个实例执行一次。
8. CFrameWnd::Create:
(1)产生主窗口(并先注册窗口类)。

(2)CFrameWnd::Create在产生窗口之前,会先引发窗口类的注册操作。(跟踪CFrameWnd::Create源码),CFrameWnd::Create——>CWnd::CreateEx——>CFrameWnd::PreCreateWindow:




(3)窗口类注册相关定义:


(4)AfxEndDeferRegisterClass完成窗口类注册操作:


9. 窗口显示与更新:

10. CWinApp::Run——程序生命的活水源头
CWinApp::Run——>CWinThread::Run——>CWinThread::PumpMessage.

11. 把消息与处理函数连接在一起:Message Map机制。MFC提供了两组宏:


12. 小结MFC程序的诞生:


13. Callback函数:凡是由你设计而却由Windows系统调用的函数,统称为callback函数。(对成员函数的调用,我们知道,内存中只会有一份类成员函数,但却可能有许多份类成员变量——每个对象拥有一份。故而,C++会以隐含的this指针指出正确的对象)。callback函数是给Windows调用的,Windows并不借助任何对象调用这个函数,也就没有传递this指针给callback函数,于是导致堆栈中有一个随机变量会成为this指针,而其结果就是程序的崩溃。所以要把某个函数用作callback函数,必须告诉C++编译器,不要让this指针作为该函数的最后一个参数,可采用如下方法:
(1)不要使用类的成员函数(也就是说,要使用全局函数)作为callback函数;
(2)使用static成员函数,也就是在函数前面加上static修饰词。static的东西是类的一部分,不属于对象。
14. 通用对话框:

深入浅出MFC——MFC程序的生死因果(三)的更多相关文章
- [转]《深入浅出MFC》– MFC程序的生死因果
1.首先MFC程序需要哪些函数库? Windows C Runtime函数库 LIBC.LIB C Runtime函数库的静态链接版本 MSVCRT.LIB C Runtime函数 ...
- 【笔记】《深入浅出MFC》第6章 MFC程序的生死因果
一.头文件说明 STDAFX.H 这个文件用来作为Precompile header file,其内只是载入其他的MFC头文件.应用程序通常会准备自己的头STDAFX.H. AFXWIN.H 每一个W ...
- 深入浅出MFC——MFC骨干程序(四)
1. 熟记MFC类层次结构: 2. AppWizard可以为我们制作出MFC程序骨干: 3. Document/View支撑你的应用程序:Document/View的价值在于,这些MFC类已经把一个应 ...
- MFC应用程序框架(转)
对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用 ...
- MFC应用程序框架入门(转)
1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...
- MFC应用程序向导生成的文件
比方说我们用Visio Studio创建了一个MFC应用程序,名称为Mysdi.在创建这个项目的时候,默认的会生成许多类和文件,就关于这些文件的内容和要点展开以下论述. 框架窗口类头文件 向导为项目M ...
- MFC原理第一讲.MFC的本质.以及手工编写MFC的程序
MFC原理第一讲.MFC的本质.以及手工编写MFC的程序 PS: 这个博客属于复习知识.从头开始讲解. 在写这篇博客之前.已经写了3篇MFC的本质了.不过掌握知识点太多.所以从简重新开始. 一丶MFC ...
- [转]深入理解MFC中程序框架
最近抽空复习了一下MFC的内容,觉得一篇博文写的不错. 原文内容太多直接给出链接吧:深入理解MFC中程序框架 链接2:深入浅出话VC++(2)——MFC的本质 链接3:MFC单文档/视图结构穷追猛打
- 01:MFC应用程序编程
一 MFC的发展 VC 1.0->VC 5.0->VC 6.0->VC2008 SP1)->VS2010 二 MFC基础 1 MFC 微软基础类库 采用类的方式,将Win32 ...
随机推荐
- Mybatis系列(一):Mybatis入门
一.Mybatis是什么 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...
- e785. 监听JList中项的变动
When the set of items in a list component is changed, a list data event is fired. // Create a list t ...
- e617. Determining the Opposite Component of a Focus Event
The opposite component is the other component affected in a focus event. Specifically, in a focus-lo ...
- C# ?? 运算符是什么?
?? 运算符定义在将可空类型分配给非可空类型时返回的默认值. int? c = null; //若 c 为 null,则 d 为 -1,否则把 c 值赋予 dint d = c ?? -1;
- linux -- "./configure --prefix "命令
源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./con ...
- 如何解析oracle执行计划
要执行任何SQL语句,Oracle 必须推导出一个“执行计划”.查询的执行计划是 Oracle 将如何实现数据的检索,以满足给定 SQL 语句的描述.它只不过是其中包含的步骤及它们之间关系的顺序树.执 ...
- NFS介绍 NFS服务端安装配置 NFS配置选项
NFS 介绍 • NFS是Network File System的缩写 • NFS最早由Sun公司开发,分2,,4三个版本,2和3由Sun起草开发,.0开始Netapp公司参与并主导开发,最新为4.1 ...
- 自定义控件?试试300行代码实现QQ侧滑菜单
Android自定义控件并没有什么捷径可走,需要不断得模仿练习才能出师.这其中进行模仿练习的demo的选择是至关重要的,最优选择莫过于官方的控件了,但是官方控件动辄就是几千行代码往往可能容易让人望而却 ...
- 如何构建高性能MySQL索引
本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引. 索引误区 多列索引 一个索引的常见误区是为每一列创建一个索引,如下面创建的索引 ...
- redhat enterprise edition 6.8:禁止ipv6后,nfs文件系统无法挂载:no such device
如题:谨记. 附注:如何禁止ipv6? 方法一 第一种方法是通过 /etc/sysctl.conf 文件对 /proc 进行永久修改. 换句话说,就是用文本编辑器打开 /etc/sysctl.conf ...