程序清单如下所示:
第一步:实现EkCreateNewWindow()函数
//创建基于“pTemplate文档模板”的新视图,并与pDocument关联
CFrameWnd* EkCreateNewWindow( CDocTemplate* pTemplate , Document* pDocument )
{
ASSERT_VALID( pTemplate );
ASSERT_VALID( pDocument );
// 1 - 创建新的框架窗口(还有他的子窗口)
CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument , NULL );
if( pFrame == NULL )
{
// 窗口创建失败
TRACE0( "Warning: failed to create new frame./n" );
return NULL;
}
ASSERT_KINDOF( CFrameWnd, pFrame );
// 2 - 告诉框架窗口自我更新
pTemplate->InitialUpdateFrame( pFrame, pDocument );
// 3 -返回新框架窗口对象的指针
return pFrame;
}
第二步:当要为一个已有的文档对象打开新视图时,使用与下面代码相似的代码段
CDocument* pDoc;
//...
//使pDoc指向要打开新视图的文档对象
//...
EkCreateNewWindow(theApp->m_ptYourTemplate , pDoc);
第三步:当用户选择相应的菜单命令或工具按钮时,应用程序创建 某一文档 的各种类型的视图,一般在文档类中处理这些命令
void CDrawDoc::OnWindowNewView()
{
}
编码工作到此结束--------------------------------
附件注释:
关于以上程序代码中的函数CDocTemplate::CreateNewFrame()的一些说明:
实际上EkCreateNewWindow()函数就是利用这个函数来创建新的框架/视图对。
下面是CDocTemplate::CreateNewFrame()函数的伪代码:
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc , CFrameWnd* pOther)
{
//1、准备上下文对象
CCreateContext context;
context.m_pCurrentFrame=pOther;
context.m_pCurrentDoc=pDoc;
context.m_pNewViewClass=m_pViewClass;
context.m_pNewDocTemplate=this;
2、创建框架窗口的C++对象
CFrameWnd* pFrame=(CFrameWnd*)m_pFrameClass->CreateObject();
3、调用LoadFrame()虚函数创建Windows窗口对象,并装载相关的资源
pFrame->LoadFrame(m_nIDResource , WS_OVERLAPPEDWINDOW | WS_ADDTOTITLE , NULL , &context );
return pFrame;
}
EkCreateNewWindow(theApp.m_ptYourTemplate , this);
本文详细介绍了如何在MFC应用程序中使用EkCreateNewWindow函数创建新的框架窗口,并关联指定的文档对象。此外,还提供了CDocTemplate::CreateNewFrame函数的工作流程说明,帮助读者理解MFC中框架窗口和视图的创建过程。


被折叠的 条评论
为什么被折叠?



