本章我们讲如何在duilib中加载多个cef浏览器窗口
之前我们已经写了如何在duilib中加载cef浏览器窗口,当时的代码其实已经实现多窗口能力
由于每个cef实例窗口是和hwnd是一一绑定的,所以每加载一个浏览器窗口,就需要在duilib中创建个窗口,然后在此窗口中去加载cef浏览器窗口。
1.duilib创建窗口
在主窗口中创建两个窗口
void CMainWnd::Notify(TNotifyUI& msg)
{
if (msg.sType == _T("windowinit"))
{
RECT rc;
GetWindowRect(GetHWND(), &rc);
RECT rectCefLayout = m_cefLayout->GetPos();
rectCefLayout.left += rc.left;
rectCefLayout.top += rc.top;
m_pCefLineUi = new CCefbrowserLineWnd(rectCefLayout);
if (m_pCefLineUi == NULL) return;
m_pCefLineUi->Create(GetHWND(), CEFBROWSER_LINE_WND, UI_WNDSTYLE_FRAME, 0L);
m_pCefLineUi->ShowWindow(true);
m_pCefPancelUi = new CCefbrowserPancelWnd(rectCefLayout);
if (m_pCefPancelUi == NULL) return;
m_pCefPancelUi->Create(GetHWND(), CEFBROWSER_PANCEL_WND, UI_WNDSTYLE_FRAME, 0L);
m_pCefPancelUi->ShowWindow(true);
}
return WindowImplBase::Notify(msg);
}
2,在每个子窗口都去加载cef浏览器
void CCefbrowserPancelWnd::Notify(TNotifyUI& msg)
{
if (msg.sType == _T("windowinit"))
{
RECT rtVerticalLayoutCEF = m_pCVerticalLayoutCEF->GetPos();
std::wstring wstrCurrentPath = L"";
wstrCurrentPath = CUtility::getInstance()->GetFullPathW(false);
std::wstring wstrCurrentHtmlPath = wstrCurrentPath + L"html\\" + CEFLINE_HTML;
HWND hwnd = GetHWND();
ret = duilibCef::LoadCef(hwnd,wstrCurrentHtmlPath, rtVerticalLayoutCEF,true);
}
return WindowImplBase::Notify(msg);
}
通过m_browser_handler指针判断,保证只创建一个BrowserHandler
bool CefManager::LoadCef(const HWND &hwnd, const std::wstring &url, const RECT &rect, const bool &bUseBrowserMenu/* = false*/)
{
Poco::Mutex::ScopedLock auto_lock(m_pLoadCefLock);
bool ret = false;
do
{
if (NULL == hwnd)
{
break;
}
if (m_browser_handler.get() == nullptr)
{
m_browser_handler = new BrowserHandler;
//m_browser_handler->SetHostWindow(hwnd);
m_browser_handler->SetUseBrowserMenu(bUseBrowserMenu);
}
m_browser_handler->SetHostWindow(hwnd);
CefWindowInfo window_info;
//window_info.SetAsWindowless(hwnd, false);
window_info.SetAsChild(hwnd, rect);
CefBrowserSettings browser_settings;
browser_settings.application_cache = STATE_DISABLED;
BOOL bSucced = CefBrowserHost::CreateBrowser(window_info
, m_browser_handler
, url //_T("http://www.baidu.com/")
, browser_settings
, NULL
, NULL);
ret = true;
} while (false);
return ret;
}
3,关闭时可以直接在主窗口调用closeAllBrowsers关闭所有
void BrowserHandler::CloseAllBrowsers(const bool &force_close/* = false*/)
{
if (!CefCurrentlyOn(TID_UI)) {
// Execute on the UI thread.
CefPostTask(TID_UI, base::Bind(&BrowserHandler::CloseAllBrowsers, this,
force_close));
return;
}
if (m_browser_list.empty())
return;
std::vector<CefRefPtr<CefBrowser>>::const_iterator it = m_browser_list.begin();
for (; it != m_browser_list.end(); ++it)
// (*it)->GetHost()->CloseBrowser(force_close);
{
CloseBrowser((*it), force_close);
}
}
void BrowserHandler::CloseBrowser(const CefRefPtr<CefBrowser> &browser, const bool &force_close/* = false*/)
{
Poco::Mutex::ScopedLock auto_lock(m_pCloseBrowserLock);
if (browser.get())
{
browser->StopLoad();
browser->GetHost()->CloseBrowser(force_close);
}
}
上一章:duilib+cef+echarts (三) 在cef浏览器中用echarts绘制图表