第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程序 ...
随机推荐
- strak组件(8):基本增删改查实现及应用和排序
效果图: 新增函数: def reverse_common_url(self, name, *args, **kwargs) 反向生成url,需要传增删改的url作为参数,携带原参数 def reve ...
- The Extinction of Some Languages【一些语言的消失】
The Extinction of Some Languages Languages have been coming and going for thousands of years, 语言的产生和 ...
- linux最大进程数
使用 ulimit -a 命令,查看 max user processes 的输出,就是系统最大进程数 core file size (blocks, -c) unlimited data seg s ...
- 009---Django的模型层(1)
ORM 全称:对象--关系--映射 数据表----类 数据行----对象 字 段----属性优势:专注于后端逻辑,不用写复杂的sql语句劣势:会忘掉sql,牺牲了效率 Django连接mysql数据库 ...
- POJ3246
Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...
- HDU 4405 Aeroplane chess(期望dp)
Aeroplane chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- Java算法求最大最小值,倒序,冒泡排序,斐波纳契数列,日历一些经典算法
一,求最大,最小值 int[] a={21,31,4,2,766,345,2,34}; //这里防止数组中有负数,所以初始化的时候给的数组中的第一个数. int max=a[0]; int min=a ...
- 内存压缩PK页面交换 解决内存问题谁更在行
一台服务器能够支持的虚拟机数量通常取决于物理硬件所能够提供的可用计算资源.大多数资源, 比如处理器周期.存储I/O和网络带宽等,都能够相对简单地进行共享.这种做法的原理在于负载并不总是处于忙碌状态,因 ...
- 成员变量和属性区别(@property那点事儿)
历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...
- javascript 数组的常用方法总结
前言 主要讨论一下数组的方法, 1.splice和slice的区别 2.pop和push 3.shift和unshift 4.join 5.forEach(es ...