《Windows编程循序渐进》——MFC封装机制详解
- 单文档
这时候资源的Dialog里只有一个关于对话框:
运行下发现,这里如果选择的是CRichEditView:
如果点击另存为的话,这里会显示后缀:
我们来看它的类视图:
文档和视图有什么区别?一个文档只有一份,而视图可以有多份,比如对于一个TXT它是一个文档:
但可以打开N次:
下面我们来跟踪一下代码流程。先来看APP,这是表征这个应用程序的类,其构造函数如下:
其头文件中这个类的定义如下:
我们在APP文件中可以看到:
这里定义了一个APP自身的类,我们在这里下断点,并运行,等断到这里之后,我们单步步入,就来到了theApp的构造函数:
然而我们再单步步入时,就来到了CWinApp的构造函数:
这个CWinApp就是theApp的父类。这个类又有自己的父类:
于是我再单步步入就来到了CWinThread的构造函数:
再单步步入:
再单步步入来到:
这里啥都没干,单步执行又来到了它的子类中,然后又回到子类的子类中,这样,直到我们再回到:
实际上已经执行了好多步骤。我们单步执行,运行到这里:
却在watch窗口发现this指针指向的不是CWinApp而是他的子类:
Why?
可以参看:http://blog.csdn.net/ningyaliuhebei/article/details/42292147的解释。因为我们创建的对象是MFCFirstSineFile,他就会把创建的对象的地址,即theApp的地址作为参数传给theApp的构造函数,而theApp的构造函数调用时先调用CWinApp的构造函数,给CWinApp传递的参数就是theApp的地址。
下面通过类视图,来了解MFC结构。
CMainFrame中执行一些创建操作,比如创建工具栏、状态栏:
Alt+G进入第一个OnCreate还可以看到它会创建帮助:
再来看PreCreateWindow,里边有一个宏函数:
Go进入:
这个函数里边注册了窗体类。
创建完窗体之后还会挂钩:
这个Hook函数中挂钩了WH_CBT消息:
该消息触发条件是这样的: 当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件。
后边有个:
这里就是实现快捷键。在资源视图中,我们也能看到这些快捷键:
继续执行,执行到这里:
更新出了一个窗体:
但是被卡住不能动。执行:
整个窗体就显示出来了:
后边再继续走会看到:
这个函数就是彻底让窗体运行起来。我们来看其中的代码:
这里在不停的接收消息。上边的PumpMessage中就是执行的:
Run之后,这个程序就运行起来了。
- MFC视图与类的剖析
我们给
构建的是窗体最外层的那一部分:
而
则构建的是里边白颜色的部分:
下面在主窗体View上创建一个按钮。在
里创建一个按钮。在CMainFrame类中添加一个成员:
并在构造函数中对其进行初始化:
在OnCreate中添加代码如下:
运行后创建的按钮是点击不了的:
因为它是在Frame上创建的,而上面覆盖了一层类似于蒙版的编辑框。这里既然点击不了,那么什么时候能够点击呢?
答案就是在View视图上创建按钮。首先我们发现这个View的父类是CRichEditCtrl,然后CRichEditCtrl的父类依次是:
CMFCFirstSingleFileView的父类当中有Create,那么它自身也必然有Create,因此我们在CMFCFirstSingleFileView的视图类中添加Create的消息响应函数:
双击并确定后添加成功:
这样就能重写父类的OnCreate。先调用父类的CRichEditView::OnCreate,然后再调用自己添加的代码。先在View类的头文件中添加成员:
添加代码如下:
此时就出现了可以点击的Button:
《Windows编程循序渐进》——MFC封装机制详解的更多相关文章
- 【转】Cookie/Session机制详解
Cookie/Session机制详解 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...
- 从mixin到new和prototype:Javascript原型机制详解
从mixin到new和prototype:Javascript原型机制详解 这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- iOS的消息转发机制详解
iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法:或者,还有另外的方法,由于Objec ...
- epoll机制详解
epoll机制详解 大牛的详解 epoll详解 什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_creat ...
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...
随机推荐
- Curator Recipes(Cache&Counter)
Cache 路径缓存(Path Cache) 监视一个ZNode,当子节点增加.更新.删除改变状态时,路径缓存会在本地保存当前子节点及其数据和状态. public PathChildrenCache( ...
- HttpContext.Current.Request.ServerVariables
Request.ServerVariables("Url") 返回服务器地址Value 0: /WebSite1/Default.aspx Request.ServerVariab ...
- 手机端H5 header定义样式
<meta content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0" ...
- 2017 01 16 校内小测 ZXR专场
我等蒟蒻爆零之后,问LincHpin大爷:“此等神题可有甚么来头?” LincHpin:“此三题皆为当年ZXR前辈所留.” 固名之,ZXR专场,233~~~ T1 勤奋的YouSiki 这个题在BZO ...
- 递归思路分解(C#)
例子一:求1!+2!+......+X! 思路分解:因为是用递归思想解决问题,也就是方法调用方法.那么肯定的方法是重复利用的.在这道题里,我们要重复利用的也就是求X!和求和 所以我们先把求X!的代码写 ...
- make -j 多核并行编译 导致笔记本过热 自动关机保护
中午在装着CentOS的笔记本上把 Oneinstack 跑起来然后去上班了,本来等着下班回来用的,回来之后发现是关机状态,环境也没有装好. 查看日志,找不到相关信息,甚至还以为是被入侵了.又试了几遍 ...
- 安卓自动化测试工具一:Monkey
一:monkey的用途:主要用于稳定性测试,模拟用户操作 二.monkey的基本使用 monkey文档地址:"<android_sdk>/docs/tools/help/monk ...
- 逃出克隆岛 (codevs 2059)
较普通的走迷宫的题 传送门 :codevs 2059 逃出克隆岛 思路 :BFS 即可 PS :传送门 不必重复使用 #include <iostream> #include < ...
- redis的持久化 rdb和aof
1.rdb(Redis DataBase) 当满足条件时,redis单独会fork(创建)一个新的线程,会先将内存中的数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次已经持久化 ...
- ACM北大学习
在两周的学习下,对ACM竞赛有了更深入地了解.学习到了很多知识,见识到了很多高手,目光放得更长远了.最后的比赛,在100多个队伍中,获得第十八的名次,也不负我的学习.