duilib+cef+echarts (四) duilib中加载cef浏览器多窗口

本章我们讲如何在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绘制图表

下一章:duilib+cef+echarts (五) duilib加载cef中js与c++的交互

源码路径:
duilib+cef+echarts,cef多窗口,js与c++交互(带回调函数的)双向通信

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值