cef3 j集成到mfc多文档视图 消息循环处理 详细
时间: 2024-03-30 18:33:20 浏览: 66
下面是一个示例程序,展示了如何在 MFC 多文档视图中集成 CEF3,并处理消息循环:
```
// MyDoc.h 文件
class CMyDoc : public CDocument
{
DECLARE_DYNCREATE(CMyDoc)
public:
CMyDoc();
virtual ~CMyDoc();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
public:
CefRefPtr<CefBrowser> m_browser; // CEF3 浏览器对象
};
// MyDoc.cpp 文件
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
END_MESSAGE_MAP()
CMyDoc::CMyDoc()
{
}
CMyDoc::~CMyDoc()
{
}
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// 创建 CEF3 的浏览器对象
CefWindowInfo window_info;
window_info.SetAsChild(::GetDesktopWindow(), CRect(0, 0, 800, 600));
CefBrowserSettings browser_settings;
CefRefPtr<CefClient> client(new CMyClient);
m_browser = CefBrowserHost::CreateBrowserSync(window_info, client, _T("http://www.baidu.com"), browser_settings, NULL);
return TRUE;
}
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
}
else
{
}
}
// MyView.h 文件
class CMyView : public CView
{
DECLARE_DYNCREATE(CMyView)
public:
CMyView();
virtual ~CMyView();
protected:
DECLARE_MESSAGE_MAP()
public:
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnInitialUpdate();
public:
CefRefPtr<CefBrowser> m_browser; // CEF3 浏览器对象
};
// MyView.cpp 文件
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
END_MESSAGE_MAP()
CMyView::CMyView()
{
}
CMyView::~CMyView()
{
}
void CMyView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: 在此添加绘制代码
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CView::PreCreateWindow(cs))
return FALSE;
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
return TRUE;
}
void CMyView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// 获取文档对象
CMyDoc* pDoc = dynamic_cast<CMyDoc*>(GetDocument());
if (!pDoc)
return;
// 获取 CEF3 的浏览器对象
m_browser = pDoc->m_browser;
if (!m_browser)
return;
// 获取浏览器的窗口句柄
CefWindowHandle hwnd = m_browser->GetHost()->GetWindowHandle();
if (!hwnd)
return;
// 设置浏览器的窗口句柄为视图的子窗口
SetParent(hwnd);
// 运行 CEF3 的消息循环
CefRefPtr<CefMessageLoop> message_loop = CefMessageLoop::GetForCurrentThread();
while (message_loop->ContinueProcessingMessage())
{
CWinApp::OnIdle(); // 处理 MFC 的空闲消息
}
}
```
在上面的示例程序中,我们在 CMyDoc 类的 OnNewDocument 函数中创建了 CEF3 的浏览器对象。在 CMyView 类的 OnInitialUpdate 函数中获取浏览器对象,并将浏览器的窗口句柄设置为视图的子窗口。然后,在该函数中加入了 CEF3 的消息循环,并在其中处理了 MFC 的空闲消息。
需要注意的是,使用 CEF3 需要包含 CEF3 的其他头文件和库文件。具体的头文件和库文件可以参考 CEF3 的官方文档。
阅读全文