毫无疑问,AppWizard和ClassWizard是MFC开发人员经常用的的工具,但是它们对某些简单的工作没有很大的帮助,例如在应用程序中增加另外一种类型的视图。尽管在MFC编程中,这是个基础任务,但是仍然要求很好的理解文档、文档模板(以及相关资源)、视图、视图框架窗口之间的联系。
CWinApp的InitInstance函数已经注册了它的默认文档模板,假设已经创建了一个新的视图类CNewDrawView,现在要把该视图类与应用程序链接起来。
1、创建 具有一个新的 文档模板资源ID 的资源,其ID为IDR_NEWDRAWTYPE。
2、在应用程序类中增加一个新的CMultiDocTemplate类型的指针成员变量,CMultiDocTemplate* m_ptNewDrawView;
3、在应用程序的InitInstance()函数中创建新的文档模板对象,该对象涉及IDR_NEWDRAWTYPE资源、CNewDrawView类。程序 清单如下所示:
m_ptNewDrawView=new CMultiDocTemplate(IDR_DRAWFORMTYPE,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CNewDrawView));
AddDocTemplate(m_ptNewDrawView);
4、现在就可以使用新文档模板了。使用EkCreateNewWindow()函数来编写程序打开一个新的窗口,该窗口使用了m_ptNewDrawView文档模板。在“3.3如何编程打开一个基于 特殊文档模板 的视图”中讨论了EkCreateNewWindow()函数。如果打算在应用程序中增加一个新类型的框架窗口(),则遵循相同的步骤,只需要在第三步构造新的文档模板时,传递新类型的框架窗口,而不是标准的CChildFrame类。
当用户选择相应的菜单命令或工具栏按钮时,就可以调用EkCreateNewWindow()函数来打开一个新的窗口,我选择在文档类中处理这些命令,对该技术而言,查找与新视图关联的文档是微不足道的。
void CDrawDoc::OnWindowNewformview()
{
EkCreateNewWindow(theApp.m_ptDrawFormView , this );
}
附加注释:
如果希望CNewDrawView类具有特殊的行为,即显示新的菜单命令,那么可以把这些命令增加到在第一步中创建的IDR_NEWDRAWTYPE菜单资源中。MFC自动的交换菜单并跟踪活动视图。