CDocTemplate::CreateNewFrame() 函数在使用MFC编写的多文档应用程序(MDI)中为文档(Document)创建其他视图(Views),CreateNewFrame() 函数原型如下:
CFrameWnd * CDocTemplate::CreateNewFrame(CDocument *, CFrameWnd *)
要调用该函数,需要指定一个CDocument 对象指针(确定函数将要创建什么视图)和一个框架窗口指针(用于复制该窗口的属性),一般第二个参数为NULL。
当应用程序调用CreateNewFrame() ,该函数创建一个新的框架窗口,并在该窗口中创建一个视图。为了更好地理解如何使用CreateNewFrame(),可以看看下面两个例子。
第一个例子是MFC源代码中的WINMDI.CPP文件。WINMDI.CPP 定义了CMIDFrameWnd::OnWindowNew()函数,该函数调用CreateNewFrame() 用于为一个指定的文档添加其他的框架和视图。每次当用户选择New菜单时,应用程序调用OnWindowNew()。OnWindowNew() 函数包含如下两行重要的代码:CFrameWnd * pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
pTemplate->InitialUpdateFrame(pFrame, pDocument);该代码创建并显示新框架窗口和文档视图。
另一个例子是MFC源代码中的DOCMULTI.CPP文件。CMultiDocTemplate::OpenDocumentFile()函数包含下列代码:CFrameWnd * pFrame = CreateNewFrame(pDocument, NULL);
注意:第二个参数是NULL 是因为OpenDocumentFile() 函数的设计假设程序员对复制包含该文档视图的其他框架不感兴趣。
CHKBOOK 例子也示范了如何为文档创建附加框架和视图,在 CHKBOOK.CPP中, CChkBookApp::OpenDocumentFile() 函数包含下列代码:CChkBookDoc * pDoc = (CChkBookDoc*)CWinApp::OpenDocumentFile(lpszFileName);
if (pDoc == NULL)return NULL;
//The line below is not required.CMDIChildWnd * pframe = ((CMDIFrameWnd *)AfxGetApp()->m_pMainWnd)->MDIGetActive();CFrameWnd * pNewFrame = m_pCheckViewTemplate->CreateNewFrame(pDoc, NULL);if (pNewFrame == NULL)return pDoc;
m_pCheckViewTemplate->InitialUpdateFrame(pNewFrame, pDoc);当你使用CreateNewFrame()时有两点需要考虑:
一、CDocTemplate::CreateNewFrame()的源代码是在DOCTEMPL.CPP中,它包含下列代码:
if (!pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, // default frame styles
NULL, &context)
由于上述代码创建框架窗口时父窗口为NULL ,MFC使用应用程序主窗口作为其父窗口。
二、CreateNewFrame() 同时创建框架和视图,而不仅仅只创建视图。
CDocTemplate::CreateNewFrame
virtual CFrameWnd* CreateNewFrame( CDocument* pDoc, CFrameWnd* pOther );
返回值
一个指向新建框架窗口的指针,出现错误时为 NULL.
参数
pDoc
新框架窗口应该引用的文档,可以是 NULL.
pOther
新框架窗口的父框架窗口,可以是 NULL.
备注
CreateNewFrame 使用 CRuntimeClass 对象传递给构造器以创建一个带有附加的视图和文档的新框架窗口。如果 pDoc 参数是 NULL, 框架输出一个 TRACE 消息.
pOther 参数用于实现窗口新命令。它提供一个框架窗口用于模型化新框架窗口。新框架窗口通常在后台创建。调用这个函数以在标准框架的新建文件和打开文件实现的外部创建框架窗口.