介紹
cef 是一個基于google chromiun的簡單的框架。 它主要是作為一個內(nèi)嵌瀏覽器嵌入到客戶端應(yīng)用程序中。
可以再 http:// 下載最新的編譯版本。
總體框架預(yù)覽
- CEF 使用了多進(jìn)程。主進(jìn)程是“browser”進(jìn)程。 而子進(jìn)程是由rederes, plugins, GPU, 等組件創(chuàng)建。
- 在ECF的所有進(jìn)程中,都可以有多線程。CEF提供了函數(shù)和接口在不同的線程中來傳遞任務(wù)。
- 一些回調(diào)方法和函數(shù)只能在特定線程和進(jìn)程中使用。在使用API之前請確保仔細(xì)閱讀注釋。
源代碼
cefsimple 工程初始化CEF并創(chuàng)建了一個簡單的瀏覽器窗口。
- 系統(tǒng)在入口點函數(shù)中(man或者wWinMain)函數(shù)中開啟browser進(jìn)程
入口點函數(shù):
- 創(chuàng)建SimpleApp的實例,在這個類中保存process-level callbacks.
- 初始化CEF并開啟消息循環(huán)。
當(dāng)CEF初始化完畢以后, SimpleApp::OnContextInitialized()會被調(diào)用。在這個方法中:
- 創(chuàng)建一個單例的SimpleHandler
- 由CefBrowserHost::CreateBrowserSync()創(chuàng)建一個瀏覽器窗口
- 所有的瀏覽器共享同一個在SimpleHandler。SimpleHandler負(fù)責(zé)定制瀏覽器的行為并保存browser-related callbacks(loading狀態(tài),標(biāo)題行為等)
當(dāng)瀏覽器窗口被關(guān)閉的時候, SimpleHandler::OnBeforeClose() 被調(diào)用。當(dāng)所有瀏覽器窗口被關(guān)閉,CEF消息循環(huán)退出。
可以看下如下代碼:
int APIENTRY wWinMain(HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPTSTR lpCmdLine
, int nCmdShow)
{
CefMainArgs args(hInstance);
CefRefPtr<MySimpleApp> app(new MySimpleApp);
int exitCode = CefExecuteProcess(args, app, NULL);
if(exitCode >= 0) return exitCode;
CefSettings settings;
CefInitialize(args, settings, app, NULL);
CefRunMessageLoop();
CefShutdown();
return 0;
}
此時進(jìn)程開啟,但是沒有任何窗口, 如果我們需要建立窗口需要如下
CefWindowInfo winInfo;
winInfo.SetAsPopup(NULL, "myCefSimple");
CefBrowserSettings browser_settings;
CefRefPtr<CefClient> client(new MySimpleClient());
std::string url = "file:///D:/project/github/cptf/resource/binding.html";
CefBrowserHost::CreateBrowser(winInfo
, client.get()
, url
, browser_settings
, NULL);
這樣就顯示出來窗口了。
但是我們發(fā)現(xiàn)在關(guān)閉的時候進(jìn)程沒有關(guān)掉, 所以我們要做如下動作。
class MySimpleClient : public CefClient
, public CefLifeSpanHandler
void MySimpleClient::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
CEF_REQUIRE_UI_THREAD();
CefQuitMessageLoop();
}
總結(jié)
App和Client是CEF中最重要的兩個類。CefExecuteProcess 和 CefInitialize 是建立app的兩個最重要方法。
而CreateBrowser 是創(chuàng)建瀏覽器窗口的最重要方法。