cef 介紹


介紹

cef 是一個基於google chromiun的簡單的框架。 它主要是作為一個內嵌瀏覽器嵌入到客戶端應用程序中。

可以再 http://cefbuilds.com 下載最新的編譯版本。

總體框架預覽

  1. CEF 使用了多進程。主進程是“browser”進程。 而子進程是由rederes, plugins, GPU, 等組件創建。
  2. 在ECF的所有進程中,都可以有多線程。CEF提供了函數和接口在不同的線程中來傳遞任務。
  3. 一些回調方法和函數只能在特定線程和進程中使用。在使用API之前請確保仔細閱讀注釋。

源代碼

cefsimple 工程初始化CEF並創建了一個簡單的瀏覽器窗口。

  1. 系統在入口點函數中(man或者wWinMain)函數中開啟browser進程
  2. 入口點函數:
    1. 創建SimpleApp的實例,在這個類中保存process-level callbacks.
    2. 初始化CEF並開啟消息循環。
  3. 當CEF初始化完畢以后, SimpleApp::OnContextInitialized()會被調用。在這個方法中:
    1. 創建一個單例的SimpleHandler
    2. 由CefBrowserHost::CreateBrowserSync()創建一個瀏覽器窗口
  4. 所有的瀏覽器共享同一個在SimpleHandler。SimpleHandler負責定制瀏覽器的行為並保存browser-related callbacks(loading狀態,標題行為等)
  5. 當瀏覽器窗口被關閉的時候, SimpleHandler::OnBeforeClose() 被調用。當所有瀏覽器窗口被關閉,CEF消息循環退出。

可以看下如下代碼:

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;
}

此時進程開啟,但是沒有任何窗口, 如果我們需要建立窗口需要如下

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);

這樣就顯示出來窗口了。
但是我們發現在關閉的時候進程沒有關掉, 所以我們要做如下動作。

class MySimpleClient : public CefClient
				, public CefLifeSpanHandler


void MySimpleClient::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
	CEF_REQUIRE_UI_THREAD();

	CefQuitMessageLoop();
}

總結

App和Client是CEF中最重要的兩個類。CefExecuteProcess 和 CefInitialize 是建立app的兩個最重要方法。
而CreateBrowser 是創建瀏覽器窗口的最重要方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM