• 单文档

这时候资源的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封装机制详解的更多相关文章

  1. 【转】Cookie/Session机制详解

    Cookie/Session机制详解   会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息 ...

  2. VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三

    目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...

  3. VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一

    目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...

  4. 从mixin到new和prototype:Javascript原型机制详解

    从mixin到new和prototype:Javascript原型机制详解   这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...

  5. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  6. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  7. iOS的消息转发机制详解

    iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法:或者,还有另外的方法,由于Objec ...

  8. epoll机制详解

    epoll机制详解 大牛的详解 epoll详解 什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_creat ...

  9. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

    文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...

随机推荐

  1. 关于CachedRowSetImpl类

    全称: com.sun.rowset.CachedRowSetImpl 父类: javax.sql.rowset.BaseRowSet 实现的接口: javax.sql.RowSet javax.sq ...

  2. IE条件注释,嗅探低版本IE用户,并引导升级

    一.科普IE条件注释 IE条件注释功能是条件注释是IE特有的一种功能,能对IE系列产品进行单独的XHTML代码处理,注意,主要是针对XHTML,而非CSS.条件注释功能非常强大,可以进行true和fa ...

  3. Android Studio报错 Error: A library uses the same package as this project

    今天在导入一个项目的时候,as报错 Error: A library uses the same package as this project 经过百度Google 发现解决办法:在modules的 ...

  4. Qt-剪切板

    ClipBoard 存在的意义 进程间数据共享. 方式 Drag And Drop: clipBoard的拖曳方式 app's ClipBoard 缺点 没有权限管理 在Model View中实现Dr ...

  5. c#计算datatable中某一列值的和

    double sumPercentage = dt.AsEnumerable().Where(dr => { return dt.Rows.IndexOf(dr) > 0; }).Sum( ...

  6. lua中string常用api

    local a="abcdefgbbb" string.sub(a,1,3) 字符串截取 返回截取的字符串           print(string.sub(a,1,3))   ...

  7. mac下 使用 versions版本控制工具 修复游戏bug过程

    1,首先拥有游戏源代码文件,修复bug之前先使用versions工具进行更新: 2,查找指定的bug之前,先运行游戏,在源代码中觉得是bug的地方打个断点,然后运行游戏的对应有bug的地方,看是否会有 ...

  8. 【C#】面试题整理

    1.C#中类是否支持多继承?请说明原因.答:不支持,需要用接口来实现多继承 2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的 ...

  9. iOS中定时器NSTimer的使用/开启与关闭

      一.只调用一次计时器方法: //不重复,只调用一次.timer运行一次就会自动停止运行 myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5  ...

  10. request获取ip

    public static String getIp(HttpServletRequest request) { String ip = request.getHeader("x-forwa ...