• 单文档

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

这时候资源的Dialog里只有一个关于对话框:

《Windows编程循序渐进》——MFC封装机制详解

运行下发现,这里如果选择的是CRichEditView:

《Windows编程循序渐进》——MFC封装机制详解

如果点击另存为的话,这里会显示后缀:

《Windows编程循序渐进》——MFC封装机制详解

我们来看它的类视图:

《Windows编程循序渐进》——MFC封装机制详解

文档和视图有什么区别?一个文档只有一份,而视图可以有多份,比如对于一个TXT它是一个文档:

《Windows编程循序渐进》——MFC封装机制详解

但可以打开N次:

《Windows编程循序渐进》——MFC封装机制详解

下面我们来跟踪一下代码流程。先来看APP,这是表征这个应用程序的类,其构造函数如下:

《Windows编程循序渐进》——MFC封装机制详解

其头文件中这个类的定义如下:

《Windows编程循序渐进》——MFC封装机制详解

我们在APP文件中可以看到:

《Windows编程循序渐进》——MFC封装机制详解

这里定义了一个APP自身的类,我们在这里下断点,并运行,等断到这里之后,我们单步步入,就来到了theApp的构造函数:

《Windows编程循序渐进》——MFC封装机制详解

然而我们再单步步入时,就来到了CWinApp的构造函数:

《Windows编程循序渐进》——MFC封装机制详解

这个CWinApp就是theApp的父类。这个类又有自己的父类:

《Windows编程循序渐进》——MFC封装机制详解

于是我再单步步入就来到了CWinThread的构造函数:

《Windows编程循序渐进》——MFC封装机制详解

再单步步入:

《Windows编程循序渐进》——MFC封装机制详解

再单步步入来到:

《Windows编程循序渐进》——MFC封装机制详解

这里啥都没干,单步执行又来到了它的子类中,然后又回到子类的子类中,这样,直到我们再回到:

《Windows编程循序渐进》——MFC封装机制详解

实际上已经执行了好多步骤。我们单步执行,运行到这里:

《Windows编程循序渐进》——MFC封装机制详解

却在watch窗口发现this指针指向的不是CWinApp而是他的子类:

《Windows编程循序渐进》——MFC封装机制详解

Why?

可以参看:http://blog.csdn.net/ningyaliuhebei/article/details/42292147的解释。因为我们创建的对象是MFCFirstSineFile,他就会把创建的对象的地址,即theApp的地址作为参数传给theApp的构造函数,而theApp的构造函数调用时先调用CWinApp的构造函数,给CWinApp传递的参数就是theApp的地址。

下面通过类视图,来了解MFC结构。

CMainFrame中执行一些创建操作,比如创建工具栏、状态栏:

《Windows编程循序渐进》——MFC封装机制详解

Alt+G进入第一个OnCreate还可以看到它会创建帮助:

《Windows编程循序渐进》——MFC封装机制详解

再来看PreCreateWindow,里边有一个宏函数:

《Windows编程循序渐进》——MFC封装机制详解

Go进入:

《Windows编程循序渐进》——MFC封装机制详解

这个函数里边注册了窗体类。

《Windows编程循序渐进》——MFC封装机制详解

创建完窗体之后还会挂钩:

《Windows编程循序渐进》——MFC封装机制详解

这个Hook函数中挂钩了WH_CBT消息:

《Windows编程循序渐进》——MFC封装机制详解

该消息触发条件是这样的: 当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件。

后边有个:

《Windows编程循序渐进》——MFC封装机制详解

这里就是实现快捷键。在资源视图中,我们也能看到这些快捷键:

《Windows编程循序渐进》——MFC封装机制详解

继续执行,执行到这里:

《Windows编程循序渐进》——MFC封装机制详解

更新出了一个窗体:

《Windows编程循序渐进》——MFC封装机制详解

但是被卡住不能动。执行:

《Windows编程循序渐进》——MFC封装机制详解

整个窗体就显示出来了:

《Windows编程循序渐进》——MFC封装机制详解

后边再继续走会看到:

《Windows编程循序渐进》——MFC封装机制详解

这个函数就是彻底让窗体运行起来。我们来看其中的代码:

《Windows编程循序渐进》——MFC封装机制详解

这里在不停的接收消息。上边的PumpMessage中就是执行的:

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

Run之后,这个程序就运行起来了。

  • MFC视图与类的剖析

我们给《Windows编程循序渐进》——MFC封装机制详解下断点,当程序运行到这里之后,并没有显示出窗口。

《Windows编程循序渐进》——MFC封装机制详解

构建的是窗体最外层的那一部分:

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

则构建的是里边白颜色的部分:

《Windows编程循序渐进》——MFC封装机制详解

下面在主窗体View上创建一个按钮。在

《Windows编程循序渐进》——MFC封装机制详解

里创建一个按钮。在CMainFrame类中添加一个成员:

《Windows编程循序渐进》——MFC封装机制详解

并在构造函数中对其进行初始化:

《Windows编程循序渐进》——MFC封装机制详解

在OnCreate中添加代码如下:

《Windows编程循序渐进》——MFC封装机制详解

运行后创建的按钮是点击不了的:

《Windows编程循序渐进》——MFC封装机制详解

因为它是在Frame上创建的,而上面覆盖了一层类似于蒙版的编辑框。这里既然点击不了,那么什么时候能够点击呢?

答案就是在View视图上创建按钮。首先我们发现这个View的父类是CRichEditCtrl,然后CRichEditCtrl的父类依次是:

《Windows编程循序渐进》——MFC封装机制详解

CMFCFirstSingleFileView的父类当中有Create,那么它自身也必然有Create,因此我们在CMFCFirstSingleFileView的视图类中添加Create的消息响应函数:

《Windows编程循序渐进》——MFC封装机制详解

《Windows编程循序渐进》——MFC封装机制详解

双击并确定后添加成功:

《Windows编程循序渐进》——MFC封装机制详解

这样就能重写父类的OnCreate。先调用父类的CRichEditView::OnCreate,然后再调用自己添加的代码。先在View类的头文件中添加成员:

《Windows编程循序渐进》——MFC封装机制详解

添加代码如下:

《Windows编程循序渐进》——MFC封装机制详解

此时就出现了可以点击的Button:

《Windows编程循序渐进》——MFC封装机制详解

相关文章:

  • 2021-12-02
  • 2021-07-06
  • 2021-10-29
  • 2021-10-06
  • 2021-06-30
  • 2021-10-16
  • 2021-06-18
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-14
  • 2021-08-14
相关资源
相似解决方案