cef1(Chromium Embedded Framework 1)

</pre>使用cef1需下载cef框架,目前的版本有:<p></p><p></p><div></div><div></div><div>CEF1使用起来还是比较简单的,不过小问题还需要不断的总结解决。</div><div></div><div>// WebClient.h 头文件</div><p></p><pre name="code" class="html">#pragma once
#include "cef1\include\cef_client.h"
#include "cef1\include\cef_app.h"
#include <list>
#include <string>
#include <sstream> 

#ifdef DEBUG
#pragma comment(lib,"cef1\\debug\\libcef_dll_wrapper.lib")
#pragma comment(lib,"cef1\\debug\\libcef.lib")
#else
#pragma comment(lib,"cef1\\release\\libcef_dll_wrapper.lib")
#pragma comment(lib,"cef1\\release\\libcef.lib")
#endif
typedef std::list<CefRefPtr<CefBrowser> > BrowserList;  


class CWebClientHandler 
	: public CefClient
	, public CefLifeSpanHandler  
	, public CefLoadHandler
	, public CefDisplayHandler

{
public:
	CWebClientHandler();
	CWebClientHandler(const std::wstring& strUrl);
	virtual ~CWebClientHandler();
public:
	//自定义方法 
	CefRefPtr<CefBrowser> GetBrowser() ;

	CefRefPtr<CefFrame> GetMainFram();

	void SetHomePage( std::wstring strUrl) ;

	const std::wstring& GetHomePage()const ;

	 HWND	GetBrowserHostWnd();

	std::wstring GetLoadingUrl();

	void Navigate(const std::wstring& strUrl);

	void CreateBrowser(HWND hParentWnd, const RECT& rect);

	void SetBrowserSize(const RECT& rect);
public:
	virtual void OnLoadStart(CefRefPtr<CefBrowser> browser,
		CefRefPtr<CefFrame> frame) ;

	virtual bool OnLoadError(CefRefPtr<CefBrowser> browser,
		CefRefPtr<CefFrame> frame,
		ErrorCode errorCode,
		const CefString& failedUrl,
		CefString& errorText) ;


	virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) ; 

private:  
	
	BrowserList browser_list_;  
	bool    m_bIsClose;  
	std::wstring m_strHomePage;  

protected:
	CefRefPtr<CefBrowser> m_BrowserPtr;
	// 添加CEF的SP虚函数
	IMPLEMENT_REFCOUNTING(CWebClientHandler);
	IMPLEMENT_LOCKING(CWebClientHandler);
};
typedef CefRefPtr<CWebClientHandler> CefRefHandlerPtr;
// WebClient.cpp 源文件

#include "StdAfx.h"
#include "WebClient.h"


CWebClientHandler::CWebClientHandler()
	: m_strHomePage(L"")
	, m_bIsClose(false)
{
	//m_BrowserPtr = new CefBrowser();
}
CWebClientHandler::CWebClientHandler(const std::wstring& strUrl)
	: m_strHomePage(strUrl)
{


}
CWebClientHandler:: ~CWebClientHandler(){}

// 创建后记录浏览器实例,否则改变窗口大小找不到句柄,无法自适应
void CWebClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) 
{
	m_BrowserPtr = browser;
}


void CWebClientHandler::CreateBrowser(HWND hParentWnd, const RECT& rect)
{
	CefSettings cSettings;  
	CefSettingsTraits::init( &cSettings);  
	cSettings.multi_threaded_message_loop = true;  
	CefRefPtr<CefApp> spApp;  
	CefInitialize( cSettings, spApp); 
	CefWindowInfo info; 
	info.SetAsChild( hParentWnd, rect);
	CefBrowserSettings browserSettings;  
	CefBrowser::CreateBrowser( info,this ,m_strHomePage, browserSettings);
	
}


void CWebClientHandler::SetBrowserSize(const RECT& rect)
{
	//CefBrowser::SetSize(PET_VIEW,rect.right-rect.left,rect.bottom-rect.top);
}
//自定义方法 
CefRefPtr<CefBrowser> CWebClientHandler::GetBrowser() 
{ 
<span style="white-space:pre">	</span>return m_BrowserPtr;
}

CefRefPtr<CefFrame> CWebClientHandler::GetMainFram()
{
	return m_BrowserPtr.get()?m_BrowserPtr->GetMainFrame():NULL; 
}




void CWebClientHandler::SetHomePage( std::wstring strUrl) 
{
	m_strHomePage=strUrl;
}




const std::wstring& CWebClientHandler::GetHomePage()const 
{
	return m_strHomePage; 
}  




HWND CWebClientHandler::GetBrowserHostWnd()
{
	return m_BrowserPtr.get()?m_BrowserPtr->GetWindowHandle():NULL;
} 




std::wstring CWebClientHandler::GetLoadingUrl()
{
	CefRefPtr<CefFrame> pMainFram=GetMainFram();  
	return pMainFram.get()?pMainFram->GetURL():L"";
}




void CWebClientHandler::Navigate(const std::wstring& strUrl)
{
	CefRefPtr<CefFrame> pMainFram=GetMainFram();  
	if ( pMainFram.get() )  
		pMainFram->LoadURL(strUrl.c_str());
}
</pre><pre name="code" class="cpp">// 在需要的地方,自己封装吧
<pre name="code" class="cpp">void ChangeSize()
{
	if(m_cWebClient.get())  
	{  
		CefRefPtr<CefBrowser> browser = m_cWebClient->GetBrowser();  
		if(browser)  
		{  
			CefWindowHandle hwnd = browser->GetWindowHandle();  
			RECT rect = GetParSize();  			
			::MoveWindow( hwnd,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top, true);  
		}  
	} 

}


 


注意:浏览器可能会接管窗口的所有行为,使用第三方库或加载ui的时候要注意在浏览器创建完成前完成,否则容易造成程序崩溃。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值