如何用CreateNewFrame() 函数创建其他视图

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 参数用于实现窗口新命令。它提供一个框架窗口用于模型化新框架窗口。新框架窗口通常在后台创建。调用这个函数以在标准框架的新建文件和打开文件实现的外部创建框架窗口.

转载于:https://www.cnblogs.com/cwbo-win/articles/3380671.html

以下是详细的cef3嵌入mfc多文档视图的教程: 1. 创建MFC多文档视图应用程序。 在Visual Studio中创建一个MFC应用程序,选择MFC多文档应用程序作为应用程序类型,接着按照向导的提示完成应用程序的创建。 2. 添加CEF3控件。 在应用程序的主框架窗口中添加一个CEF3控件,可以使用MFC自带的WebBrowser控件,也可以使用第三方的CEF3控件。 使用MFC自带的WebBrowser控件,可以在主框架窗口的OnInitDialog函数中添加以下代码: ``` CRect rect; GetClientRect(&rect); m_webBrowser.Create(NULL, NULL, WS_VISIBLE | WS_CHILD, rect, this, IDC_EXPLORER); m_webBrowser.Navigate(_T("about:blank"), NULL, NULL, NULL, NULL); ``` 使用第三方的CEF3控件,可以在主框架窗口的OnInitDialog函数中添加以下代码: ``` CRect rect; GetClientRect(&rect); m_cef3.Create(rect, this, 0); m_cef3.InitBrowser("http://www.baidu.com"); ``` 其中,m_webBrowser和m_cef3分别是WebBrowser控件和CEF3控件的成员变量。 3. 创建文档类。 创建一个派生自CDocument的文档类,在其中添加CEF3的初始化和销毁代码。可以在文档类的构造函数中添加以下代码来初始化CEF3: ``` CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine(); CefRefPtr<CefApp> app = new CCefApp; CefMainArgs args(::GetModuleHandle(NULL)); CefExecuteProcess(args, app.get(), NULL); CefSettings settings; CefInitialize(args, settings, app.get(), NULL); ``` 在文档类的析构函数中添加以下代码来销毁CEF3: ``` CefShutdown(); ``` 4. 创建视图类。 创建一个派生自CView的视图类,在其中添加CEF3的初始化和销毁代码。可以在视图类的构造函数中添加以下代码来初始化CEF3: ``` CefRefPtr<CefRequestContext> request_context = CefRequestContext::CreateContext(CefRequestContextSettings(), NULL); CefRefPtr<CefBrowser> browser = CefBrowserHost::CreateBrowserSync(NULL, request_context, this, CefBrowserSettings(), NULL, NULL); CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle(); ::SetParent(hwnd, GetSafeHwnd()); ``` 在视图类的析构函数中添加以下代码来销毁CEF3: ``` CefRefPtr<CefBrowserHost> host = browser->GetHost(); host->CloseBrowser(true); browser = NULL; ``` 其中,browser是CEF3的浏览器对象。 5. 添加消息处理函数和事件处理函数。 在视图类中添加CEF3控件的消息处理函数和事件处理函数。 消息处理函数的代码如下: ``` void CMyView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); if (browser && browser->GetHost()) { CefRect rect(0, 0, cx, cy); browser->GetHost()->WasResized(); browser->GetHost()->SetFocus(true); } } ``` 事件处理函数的代码如下: ``` bool CMyView::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) { if (message->GetName() == "custom_message") { // 处理自定义消息 return true; } return false; } ``` 6. 注册文档类型。 在应用程序的主框架窗口中,使用相应的文档类和视图类注册一个新的文档类型。可以在主框架窗口的InitInstance函数中添加以下代码来注册文档类型: ``` CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MFCApplicationTYPE, RUNTIME_CLASS(CMFCApplicationDoc), RUNTIME_CLASS(CChildFrame), // 自定义框架窗口类 RUNTIME_CLASS(CMFCApplicationView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); ``` 其中,CChildFrame是自定义的框架窗口类,CMFCApplicationView是自定义的视图类。 7. 创建文档。 在应用程序的主框架窗口中,使用相应的文档类和视图创建一个新的文档。可以在主框架窗口的OnFileNew函数中添加以下代码来创建文档: ``` CDocument* pDoc = NULL; CMultiDocTemplate* pTemplate = GetDocTemplate(RUNTIME_CLASS(CMFCApplicationDoc)); if (pTemplate != NULL) pDoc = pTemplate->CreateNewDocument(); if (pDoc != NULL) { AddDocument(pDoc); pDoc->SetTitle(_T("New Document")); pDoc->OnNewDocument(); CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDoc, NULL); if (pFrame != NULL) { pTemplate->InitialUpdateFrame(pFrame, pDoc); } } ``` 其中,CMFCApplicationDoc是自定义的文档类。 8. 显示CEF3控件。 在新文档的视图中,初始化并显示CEF3控件。可以在视图类的OnInitialUpdate函数中添加以下代码来显示CEF3控件: ``` CRect rect; GetClientRect(&rect); browser->GetHost()->SetSize(PET_VIEW, rect.Width(), rect.Height()); browser->GetHost()->WasResized(); browser->GetHost()->SetFocus(true); ``` 其中,browser是CEF3的浏览器对象。 以上就是cef3嵌入mfc多文档视图的详细教程,希望能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值