第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程序 ...
随机推荐
- C语言实例解析精粹学习笔记——29
题目: 将字符行内单字之间的空格平均分配插入到单字之间,以实现字符行排版.也就是输入一个英文句子,单词之间的空格数目不同,将这些空格数平均分配到单词之间,重新输出. 代码如下(是原书中配套的代码,只是 ...
- python-9-IO编程
1-文件读写 f = open('d:/file.txt','r') #如果文件不存在会报异常 print(f.read()) #一次性读取所有内容 f.close() 1.2 由于文件操作会用异常, ...
- 代码review的流程
以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...
- anr trace文件分析
测试给的trace文件好几万行,怎么看? 1.搜索 你的包名,看它报错误报在你代码的哪里 2.在你代码里面分析 还有,synchronized 就是用来防止多线程调用的,没有那么神奇.
- 你是怎么封装一个view的
可以通过纯代码或者xib的方式来封装子控件 建立一个跟view相关的模型,然后将模型数据传给view,通过模型上的数据给view的子控件赋值 /** * 纯代码初始化控件时一定会走这个方法 */ - ...
- 关于MySQL查询优化 の 30条忠告
撸自:http://www.jincon.com/archives/120/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...
- python multiprocessing.Pool 中map、map_async、apply、apply_async的区别
multiprocessing是python的多进程库,multiprocessing.dummy则是多线程的版本,使用都一样. 其中都有pool池的概念,进程池/线程池有共同的方法,其中方法对比如下 ...
- 如何将自己写的代码上传到github上
忙活了一下午终于成功把代码上传到github上. 接下来就是我上传代码的步骤: ①首先注册github账号,登录,创建新仓库 ,点击+,点击new repository 得到如下页面,填写仓库名,自己 ...
- Ironic-Python-Agent
Ironic-Python-Agent 在PXE部署环境中,deploy模块是通过打开一个iSCSI设备,ironic-conductro将OS的镜像文件写到iSCSI的设备,所以deploy_ram ...
- 使用BootStrapValidator来完成前端输入验证
BootStrapValidator可以用于完成基于BootStrap搭建的前端UI中的输入验证,由于本插件完全基于BootStrap因此可以和UI完美的融合在一起.下面直接上图,看看完成后的结果: ...