cef3集成 mfc多文档视图demo
时间: 2023-08-13 09:03:18 浏览: 192
在MFC多文档应用程序中,每个文档都有一个视图对象,用于显示文档的内容。如果要在视图中添加CEF3浏览器控件,可以参考以下步骤:
1. 在文档类的头文件中添加一个成员变量,用于保存CEF3浏览器控件。例如:
```cpp
CefRefPtr<CefBrowser> m_browser;
```
2. 在文档类的构造函数中,创建CEF3浏览器控件。例如:
```cpp
CefWindowInfo window_info;
CefBrowserSettings browser_settings;
window_info.SetAsChild(hWnd, rect);
CefRefPtr<SimpleHandler> handler(new SimpleHandler());
CefBrowserHost::CreateBrowser(window_info, handler.get(), url, browser_settings, NULL);
m_browser = handler->GetBrowser();
```
其中,SimpleHandler是一个自定义的CefClient子类,用于处理浏览器事件。
3. 在文档类的析构函数中,销毁CEF3浏览器控件。例如:
```cpp
if (m_browser)
{
CefRefPtr<CefBrowserHost> host = m_browser->GetHost();
if (host)
host->CloseBrowser(true);
m_browser = NULL;
}
```
4. 在文档类的OnInitialUpdate函数中,将CEF3浏览器控件添加到视图中。例如:
```cpp
CRect rect;
GetViewRect(rect);
CefWindowHandle hWnd = GetSafeHwnd();
CefRefPtr<CefBrowserHost> host = m_browser->GetHost();
if (host)
host->SetWindowHandle(hWnd);
CWnd* pWnd = GetView();
if (pWnd)
{
CefRefPtr<CefBrowserHost> host = m_browser->GetHost();
if (host)
host->WasResized();
CefRefPtr<CefBrowser> browser = m_browser;
CefRefPtr<CefRenderHandler> handler = new RenderHandler(pWnd->m_hWnd, browser);
host->SetRenderHandler(handler);
}
```
其中,RenderHandler是一个自定义的CefRenderHandler子类,用于处理浏览器的渲染事件。
5. 在视图类的头文件中添加一个成员变量,用于保存CEF3浏览器控件的句柄。例如:
```cpp
CefWindowHandle m_browserHwnd;
```
6. 在视图类的构造函数中,将文档类中保存的CEF3浏览器控件句柄保存到成员变量中。例如:
```cpp
CMyDoc* pDoc = GetDocument();
if (pDoc)
m_browserHwnd = pDoc->m_browser->GetHost()->GetWindowHandle();
```
7. 在视图类的OnPaint函数中,绘制CEF3浏览器控件。例如:
```cpp
if (m_browserHwnd)
{
CRect rect;
GetClientRect(rect);
CefRefPtr<CefBrowserHost> host = CefBrowserHost::GetBrowserHost(m_browserHwnd);
if (host)
host->Invalidate(PET_VIEW);
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(m_hWnd, &ps);
if (hdc)
{
CefRefPtr<CefBrowserHost> host = CefBrowserHost::GetBrowserHost(m_browserHwnd);
if (host)
host->SendExternalBeginFrame();
::EndPaint(m_hWnd, &ps);
}
}
```
以上就是在MFC多文档应用程序中集成CEF3浏览器控件的基本步骤。具体的实现细节可以参考CEF3的官方文档和示例代码。
阅读全文