查了半天MSDN才找到,比较巧。
有几个类要搞清楚,CDocument,CDocTemplate,CDocManager(这个在MSDN里查不到~我的版本太老了?),他们的关系要看MFC源码,也不是很难弄清楚,比如从OnFileNew这个东西开始找,可以在CWinApp里找到,还有CDocManager,在后者里,最后一句是:
pTemplate->OpenDocumentFile(NULL);
于是找一下CDocTemplate的这个函数说明,找源码也行,里面也有注释,他有两个参数,如果第一个为NULL,则会新建一个空的文档,并返回它的指针,CDocument*,就是我要的功能,关键是这个pTemplate怎么得到,看前面代码,它是用:
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
而这个CDocManager的实例可以在theApp里找到,这个是唯一的一个全局变量,加上一句声明:extern CMyApp theApp;就可以用了,进m_pDocManager没问题,可是再访问m_templateList就出了问题,是protected权限,没办法了,我都想直接修改MFC源码了~~(怕改乱了)
其实有更直接的方法,CDocument有一个成员函数直接得到:
CDocument::GetDocTemplate()
OK,这样就可以在文档类里实现用代码新建另外一个文档,完了可以设置标题等等。
另外一个同窗在做代码的时候,把菜单的响应事件不小心放到了文档类里,我建议他放在视类,因为视类优先响应消息,文档专门管理文档,他不听,他说书上写在文档类里的,晕~~(破书扔了)后来在文档类里响应了之后要马上更新一下视类,不然会让人觉得没有反应,刚打开的文件显示都没变,不是觉得很奇怪吗?很自然的想到Invalidate(),但是这是在文档类怎么办?
找到两个成员函数:
GetFirstPosition()
GetNextView()
怎么做到看帮助。于是我想到,原来文档和视类是这么层关系,一个文档可以有多个视类,而一个视类只有一个文档。
同样的CDocTemplate和CDocument也是类似一个树状关系,如下图所示:
评论