cef3集成mfc多文档视图 demo
时间: 2023-08-16 08:09:43 浏览: 76
很抱歉,我之前的回答有误。以下是一个CEF3集成MFC多文档视图的demo步骤:
1. 创建一个MFC多文档应用程序
2. 在项目中添加CEF3库和头文件
3. 在你的MFC应用程序中添加一个CefView类,该类继承自CWnd并实现CEF浏览器的初始化和绘制。
4. 在你的文档类中添加一个成员变量m_cefView,该变量为CefView类型。
5. 在你的文档类中重载OnInitialUpdate函数,并在该函数中创建并添加CefView视图
6. 在你的视图类中重载OnSize函数,并在该函数中调用CefView的MoveWindow函数以确保CEF浏览器与视图控件的大小相匹配。
以下是一个简单的示例代码:
CefView.h文件
```c++
#pragma once
#include <afxwin.h>
#include "include/cef_client.h"
class CefView : public CWnd, public CefClient, public CefLifeSpanHandler
{
public:
CefView();
virtual ~CefView();
// CefClient methods
virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE
{
return this;
}
// CefLifeSpanHandler methods
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;
// CefView methods
void Initialize();
protected:
CefRefPtr<CefBrowser> m_browser;
DECLARE_MESSAGE_MAP()
};
```
CefView.cpp文件
```c++
#include "CefView.h"
#include "include/cef_browser.h"
BEGIN_MESSAGE_MAP(CefView, CWnd)
END_MESSAGE_MAP()
CefView::CefView()
{
}
CefView::~CefView()
{
}
void CefView::Initialize()
{
CefMainArgs args(::GetModuleHandle(NULL));
CefRefPtr<CefApp> app(new CefApp);
int exit_code = CefExecuteProcess(args, app.get(), NULL);
if (exit_code >= 0)
{
exit(exit_code);
}
CefSettings settings;
settings.multi_threaded_message_loop = true;
settings.windowless_rendering_enabled = true;
CefInitialize(args, settings, app.get(), NULL);
}
void CefView::OnAfterCreated(CefRefPtr<CefBrowser> browser)
{
m_browser = browser;
}
void CefView::OnBeforeClose(CefRefPtr<CefBrowser> browser)
{
m_browser = NULL;
}
```
在你的文档类中添加成员变量m_cefView
```c++
class CMyDoc : public CDocument
{
public:
CMyDoc();
virtual ~CMyDoc();
// Overrides
public:
virtual BOOL OnNewDocument();
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual void Serialize(CArchive& ar);
virtual void OnCloseDocument();
protected:
CefView m_cefView;
DECLARE_MESSAGE_MAP()
};
```
在你的文档类中重载OnInitialUpdate函数,并在该函数中创建并添加CefView视图
```c++
void CMyDoc::OnInitialUpdate()
{
CDocument::OnInitialUpdate();
CRect rect;
GetContentRect(rect);
if (m_cefView.GetSafeHwnd() == NULL)
{
m_cefView.Create(NULL, NULL, WS_CHILD | WS_VISIBLE, rect, this, 0);
m_cefView.Initialize();
}
}
```
在你的视图类中重载OnSize函数,并在该函数中调用CefView的MoveWindow函数以确保CEF浏览器与视图控件的大小相匹配。
```c++
void CMyView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if (m_pDocument != NULL && m_pDocument->m_cefView.GetSafeHwnd() != NULL)
{
m_pDocument->m_cefView.MoveWindow(0, 0, cx, cy);
}
}
```
希望这个demo可以帮助到你。