第3章 MFC框架程序剖析
参考: https://blog.csdn.net/u014162133/article/details/46573873
1、

2、MFC简介:MFC(Microsoft Foundation Class,微软基础类库)是微软为了简化程序员的开发工作所开发的一套C++类的集合,是一套面向对象的函数库,以类的方式提供给用户使用。利用这些类,可以有效发帮助程序员完成Windows应用程序的开发。
MFC AppWizard是一个辅助生成源代码的向导工具,它可以帮助我们自动生成基于MFC框架的源代码。在向导的每一个步骤中,我们可以根据需要来选择各种特性,从而实现定制应用程序。
3、我们在编写MFC程序时,在我们编写的程序中找不到WinMain函数,是因为MFC做了封装,将这些放到了安装路径下,比如:D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC,WinMain函数在APPMODUL.CPP文件中,这个函数是在程序编译链接时,由链接器将该函数链接到我们的MFC程序中的。
4、MFC大致流程
CTestApp theApp;//构造全局对象
WinMain()
{
AfxWinMain();//调用下面的函数
}
AfxWinMain()
{
pThread->Initinstance();//初始化工作和注册窗口类,窗口显示和更新
pThread->Run();//消息循环
} //而在BOOL CTestApp::InitInstance()中的代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
//完成了将这三个类关联起来的工作。
程序执行顺序
(1) 先执行到全局对象定义处:CTestApp theApp;
(2) 然后到了TestApp的构造函数
(3) 然后才执行到WinMain函数
5、在程序入口函数main或WinMain加载前,系统已经为全局变量或全局对象分配了存储空间,并为他们赋了初始值。对一个全局对象来说,此时就已经调用了该对象的构造函数,构造该对象,并进行初始化操作。
在MFC程序中,在WinMain之前有个theApp全局变量先被构造并被初始化,而由于子类构造函数执行前,其父类的构造函数先被执行,所以CTestApp的父类CWinAPP的构造函数先执行。产生了theApp对象后,在WinMain()中的指针*pThread和*pApp就有了内容,这两个指针返回的都是theApp对象的地址。
6、对MFC程序来说,通过产生一个应用程序类的对象来唯一标识应用程序的实例。每一个MFC程序有且仅有一个从应用程序类(CWinApp)派生的类。每一个MFC程序实例有且仅有一个该派生类的实例化对象,也就是theApp全局对象。该对象就表示了应用程序本身。
7、在MFC中,以Afx为前缀的函数都是全局函数,可以在程序的任何地方调用它们。
8、

9、

10、窗口类、窗口类对象与窗口关系

11、如何在单文档文件中显示一个CButton的对象?
在CMainFrame::OnCreate()中定义一个CButton的对象btn;然后调用
btn.Create("维新",WS_DISABLED   |WS_CHILD | WS_VISIBLE | BS_AUTO3STATE,  CRect(,,,),/*GetParent(),*/this,);
注意:
(1) 此处btn不能是局部变量,否则它的生命周期太短,将不能显示。
(2) 在CBUTTON类的Create函数的第二个参数中加入WS_VISIBLE 参数才行。否则必须调用ShowWindow显示,也可以在view的OnCreate消息响应函数中加入
(3) CButton类的定义头文件在afxwin.h中,而stdafx.h包含了afxwin.h,所以可以直接使用。因为MFC中的每一个类中都有#include "stdafx.h"的声明。
(4) 按钮的父窗口不同,其显示位置也会有所差异。
12、一些常用快捷方式:
| 
 功能分类  | 
 快捷键  | 
 说明  | 
| 
 File (文件)  | 
 Ctrl+N  | 
 New新建工程  | 
| 
 Ctrl+O  | 
 Open 打开文件  | 
|
| 
 Find (查找)  | 
 Alt+F3/Ctrl+F  | 
 弹出查找对话框  | 
| 
 F3  | 
 查找下一个  | 
|
| 
 Shift+F3  | 
 查找上一个  | 
|
| 
 Ctrl+H  | 
 替换  | 
|
| 
 Ctrl+]/Ctrl+E  | 
 寻找下一半括弧  | 
|
| 
 F4  | 
 寻找下一个错误/警告位置  | 
|
| 
 Shift+F4  | 
 寻找上一个错误/警告位置  | 
|
| 
 格式  | 
 Ctrl+U  | 
 将选定区域转换成小写  | 
| 
 Ctrl+Shift+U  | 
 将选定区域转换成大写  | 
|
| 
 Alt+F8  | 
 自动格式重排  | 
|
| 
 Build (建立)  | 
 F7  | 
 Build(编绎并链接成exe文件)  | 
| 
 Ctrl+F7  | 
 Compile(编译)  | 
|
| 
 Ctrl+F5  | 
 Execute(编译+链接+运行)  | 
|
| 
 Ctrl+Shift+F5  | 
 Restarts the program(重新运行程序)  | 
|
| 
 Debug (调试)  | 
 F5  | 
 Go(顺序执行)  | 
| 
 F11  | 
 step into (顺序执行,进入循环或函数)  | 
|
| 
 F10  | 
 step over(顺序执行,不进入循环或函数)  | 
|
| 
 Ctrl+F10  | 
 Run to cursor(自动执行到用户光标所指的语句前)  | 
|
| 
 Shift+F5  | 
 Stop Debugging(停止调试)  | 
|
| 
 F9  | 
 Insert/Remove breakpoint(在当前行插入/去掉断点)  | 
|
| 
 Ctrl+Shift+F9  | 
 去掉所有断点  | 
第3章 MFC框架程序剖析的更多相关文章
- 关于MFC框架程序中CWinApp::OnIdle
		
很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...
 - MFC框架程序解析
		
MFC的 程序框架: WinMain函数:程序首先到达全局变量theApp,再到达theAPP的构造函数,最后到达WinMain函数处. 问:为何要定义一个全局对象theAPP,让其在WinMain函 ...
 - MFC应用程序框架(转)
		
对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用 ...
 - MFC应用程序框架入门(转)
		
1 MFC概述 顾名思意,MFC应用程序框架是以MFC作为框架基础的,以此程序框架模式搭建起来的应用程序在程序结构组织上是完全不同于以前的Win32 SDK编程方式的.自20世纪90年代初问世以来,M ...
 - VS2010/MFC编程入门之四(MFC应用程序框架分析)
		
VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html 上一讲鸡啄米讲的是VS2010应用 ...
 - [转]深入理解MFC中程序框架
		
最近抽空复习了一下MFC的内容,觉得一篇博文写的不错. 原文内容太多直接给出链接吧:深入理解MFC中程序框架 链接2:深入浅出话VC++(2)——MFC的本质 链接3:MFC单文档/视图结构穷追猛打
 - 第四课——MFC应用程序框架
		
一.MFC应用程序类型 上篇文章的彩蛋:可通过使用MFC应用程序向导(MFC AppWizard)的功能来创建所需要的应用程序,这意味着不需要输入任何代码.MFC除了应用程序向导,还对应用程序项目有着 ...
 - VS2010-MFC(MFC应用程序框架分析)
		
转自:http://www.jizhuomi.com/software/145.html 一.SDK应用程序与MFC应用程序运行过程的对比 程序运行都要有入口函数,在之前的C++教程中都是main函数 ...
 - MFC学习-第2,3课 MFC框架的运行机制
		
转自:http://blog.163.com/zhigang0633@126/blog/static/38790491200822711526168/ 讲述MFC AppWizard的原理与MFC程序 ...
 
随机推荐
- awk命令例子详解
			
awk -F: '{print "Number of dields: "NF}' passwd 字段分隔符设为冒号,所以每条记录的字段数变成7: awk '{print &quo ...
 - 25-IHostEnvironment和 IApplicationLifetime介绍
			
//类似 global.ashx的application事件的实现1-Startup类中 public void Configure(IApplicationBuilder app, IHosting ...
 - 笔记-python-module-logging.循环日志、多进程日志
			
笔记-python-module-logging.循环日志.多进程日志 1. logging循环日志 循环日志分为按大小切分和按时间切分,对应实现类如下. 1.1. RotatingFil ...
 - 生成heap dump
			
在查看内存泄露以及对内存问题中,要dump出当前内存堆存储快照,便于分析.有几种方法可以做,简介如下 一.intellij IDEA 由于我用的是intellij IDEA,所以没有介绍Eclipse ...
 - Android 数据库中的数据给到ListView
			
前言:因为之前学的都是用一个自己定义的类,完成将某一个bean中的数据直接获取,而实际中通常是通过数据库来得到的,总之,最终就是要得到数据.提一下最重要的东西,我把它叫做代理,如同一个校园代理,没有他 ...
 - 3226: [Sdoi2008]校门外的区间
			
链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...
 - 如何让button保持点击状态
			
http://blog.csdn.net/u010957508/article/details/38385207 他的原理就是在代码里面: view.setSelected(true); 而其他的: ...
 - 《Cracking the Coding Interview》——第14章:Java——题目3
			
2014-04-26 18:59 题目:final.finally.finalize有什么区别? 解法:烂大街之java语法题.此题被多少公司考过我不知道,反正我确实遇见过一次了. 代码: // 14 ...
 - 运用Pascal来破坏DLL的一个实例
			
运用Pascal来破坏DLL文件的一个实例 关于Pascal静态调用和动态的调用DLL的学习您可以看Delphi/Lazarus栏目. Uses Dos; {调用DOS库} Const Root='C ...
 - vue实现数据的增删改查
			
在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...