文档类对象和视图对象的绑定
对于单文档结构而言,文档负责处理数据,而视图类负责显示和交互,那么视图和文档类必须形成绑定关系才行,这种绑定关系是在创建视图类窗口的时候就会形成的,MFC内部在创建视图的时候会要求我们传入一个CCreateText结构,该结构里面包含了一个m_pNewViewClass和m_pCurrentDoc,m_pNewViewClass变量保存的是你要创建的视图类的静态变量CRuntimeClass的地址,m_pCurrentDoc保存的是文档类对象的地址(还有m_pLastView,m_pCurrentFrame两个成员,是用于共享视图或者框架使用的)。
创建视图窗口成功后,视图类对象响应ON_CREATE消息的处理函数,并且把创建视图窗口的所有参数传递给该函数,其中就包括CCreateText结构,这样在内部就可以拿到文档对象和视图静态变量的地址,然后就可以将该地址保存到文档类对象的一个链表里面,让文档对象和新创建的视图类对象建立绑定关系。
由于文档类对象保存视图类静态变量地址的是链表,而类对象内部有一个参数保存文档对象的只是一个参数,所以一个文档对象可以保存多个视图类对象,但是一个类对象只能对应一个文档对象。
以下代码只是说明创建视图时和文档类绑定的过程,不是真正的代码,省略了很多内容。
CMyFrameWnd* pFrame = new CMyFrameWnd;
CMyDoc* pDoc = new CMyDoc;
CCreateContext cct;
cct.m_pCurrentDoc = pDoc;//文档类对象地址
cct.m_pNewViewClass = RUNTIME_CLASS(CMyView);//&CMyView::classCMyView
pFrame->LoadFrame(... &cct)//函数内部this为pFrame
{
Create(...,&cct)//函数内部this为pFrame