正文

用代码新建空白文档(MDI)2007-07-23 02:50:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/27755.html

分享到:

查了半天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也是类似一个树状关系,如下图所示:

阅读(6761) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册