cef3嵌入mfc多文档视图 详细教程
时间: 2023-07-29 14:06:22 浏览: 307
以下是详细的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多文档视图的详细教程,希望能够对你有所帮助。
阅读全文