</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的时候要注意在浏览器创建完成前完成,否则容易造成程序崩溃。