MFC笔记-SDI窗口-类之间的调用总结

MFC笔记-SDI窗口-类之间的调用总结

学MFC的时候有一段时间被类与类之间的函数调用整的模模糊糊的,函数调用老是出错。这里记述一下自己的总结,供日后查阅。

SDI中的类与对象:

想自如的调用函数,首先要知道SDI窗口的基本框架。类向导创建的程序框架中无非也就是帮你建了4个窗口类(应用程序类,Frame框架类,文档类,View视图类),4个对象(应用程序对象,框架窗口类对象,文档对象,视图对象),大致是一个类对应一个实例对象。

编写代码其实就是在设计类(设计成员变量及成员函数),对程序来说相当于指明了规则,程序在运行时先按照我们写的类的框架生成实体化的对象,然后对象再按照我们的规则来运行。

比如在视图类中用类向导添加了一个“WM_LBUTTONDOWN”消息的处理函数。然后再编辑代码添一行messagebox()函数,实际上就是告诉程序:“如果有人按下鼠标左键,那你就按照我给你的代码弹出消息框”。就是这末个流程!

其次要知道要调用的函数是作用于对象而不是作用于类的,类比较虚,而对象是实实在在的,在一个类中调用其它类时要获取对象的指针,然后再调用对象的成员函数来进行操作。
(当然貌似C++书中有些类(好像是静态方法的,记不清了)是可以不创建对象直接调用的。不过应该用的很少)

如何在一个类中调用另一个类的函数呢?类与类之间虽然看得见,但是摸不着,他们之间的联系还是通过对象来完成的!举个自身例子,当我还是MFC小白的时候(当然现在也是!哦呵呵呵!现在已经MFC小学二年级啦!),有一次在doc类自己添加了一个成员函数。然后我在view类中的一个函数中想要调用它,直接写函数名编译器马上就不乐意了,后来我悟出来了:我在doc类中写的函数是doc类的成员函数,想要调用它应该先获取doc类的对象(文档对象),然后你直接“文档对象名.成员函数”或者“文档对象指针->成员函数”不就行了,
那么怎么获取doc的对象呢,可以先定义一个doc类的指针,然后调用GetDucument()函数,就一行代码就行.下面来个示例(其实就是view类中的onDraw()函数的第一行代码):

CXXXDoc* pDoc = GetDocument();

那么程序是如何运行的嘞?这几个类对应的对象在程序中是在哪创建的?如何在一个类中随心所欲的调用其它类中的函数嘞?

程序首先创建一个应用程序对象,再在里头创建一个frame框架对象,再在frame对象中创建一个view视图对象,(doc文档对象就不列了因为获取其指针只需要一个GetDocument()就行了)。这样它们三个层层包含。因为MFC是基于消息驱动,接下来就开启死循环大法,一有鼠标点击之类的消息就赶紧处理,直到关掉程序为止。

这几个类对应的对象在程序中是在哪创建的?app类是在一开始的时候就最先创建的,框架类是在app类里创建的,视图类是在框架类里创建的。具体参见孙鑫老师的C++课程(这里给出链接:http://tech.163.com/special/0009159F/vc.html)。

如何在一个类中随心所欲的调用其它类中的函数嘞?

文档类最容易:调用GetDocument()函数获得文档对象指针,已经写过。

app类也很容易:AfxGetApp()函数获得应用程序指针,这个一般都是用来进一步获得框架类对象或者视图类对象的指针的。

框架类也不难,如下:

CWnd* AfxGetMainWnd( ); 
使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法。

view类也一样:

CXXXView *pView = (CXXXView *)((CMainFrame *)AfxGetApp()->GetMainWnd())->GetActiveView();

注意:别忘了在Doc.cpp文件上面加上

include "XXXView.h"
include "MainFrm.h"

不加会报错!

写的有点乱,目标其实就只是解决在不同类之间数据,函数的调用这一个问题!

如果有错误!还请指出!笔者在此先行谢过!

2016.5.27

你可能感兴趣的:(MFC)