欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2019 MFC中使用CEF

程序员文章站 2022-07-14 09:26:09
...

VS2019 MFC中使用CEF

Chromium Embedded Framework (CEF)是基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。
软件环境:
Windows 10家庭版
Visual Studio 2019
CEF 83.3.11+g1fac1e5+chromium-83.0.4103.61 / Chromium 83.0.4103.61,这个版本的Debug与VS2017有些不兼容,只能使用Release方式编译。但在VS2019中均可编译通过。
“D:\MyProjectsVS.1\cef_binary_83.3.11\”为CEF工程目录

下载(http://opensource.spotify.com/cefbuilds/index.html#windows32_builds
cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32.tar.bz2
如果需要调试信息,则还需要下载:(具体用法自行查找)
cef_binary_83.3.11+g1fac1e5+chromium-83.0.4103.61_windows32_debug_symbols.tar.bz2
我使用的是32位版的

解压后使用CMake工具生成VS2019的工程,步骤如下:

  1. 选择好源和目的文件夹
  2. 配置生成器为Visual Studio 16 2019
  3. 生成目标环境
  4. 使用VS2019打开工程

VS2019 MFC中使用CEF
VS2019 MFC中使用CEF
编译工程,注意选择Win32平台Debug方式,完成后获得以下三个文件:
D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.lib
D:\MyProjectsVS.1\cef_binary_83.3.11\Debug\ libcef.dll
D:\MyProjectsVS.1\cef_binary_83.3.11\libcef_dll_wrapper\Debug\libcef_dll_wrapper.lib

由于CEF是多进程内嵌,所以需要两个类class SimpleApp和class SimpleHandler,其中SimpleApp是用于在用户程序中创建内嵌CEF应用,而SimpleHandler是负责传递各种消息,这些消息是以虚函数的形式显现出来。SimpleHandler是继承于多个处理类,每增加一个处理类需要调用该类的GetDisplayHandler函数取得句柄,然后调用各种消息处理函数。

导入自己的工程需要四个文件(可改名),其中的产生的CefBrowser指针需由自己管理,官方例子中使用了std::list类型保存多个实例。
simple_app.cc
simple_app.h
simple_handler.cc
simple_handler.h
另外还要将D:\MyProjectsVS.1\cef_binary_83.3.11\include目录复制到自己的工程。

在应用程序的CMyApp::InitInstance()中添加初始化代码:

CefMainArgs main_args(m_hInstance);  
CefRefPtr<SimpleApp> app(new SimpleApp);
int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
if (exit_code >= 0)
{
	exit(exit_code);
}
CefSettings settings;
CefSettingsTraits::init(&settings);
settings.no_sandbox = true;
settings.multi_threaded_message_loop = true;
CefInitialize(main_args, settings, app.get(), NULL);

在相应的CWebView::OnCreate(LPCREATESTRUCT lpCreateStruct)中生成浏览器窗口

CefWindowInfo info;  
CefBrowserSettings settings;  
cef32_handler = new SimpleHandler(true);

info.SetAsChild(m_hWnd, CRect(0, 0, 1000, 1000));  
CefBrowserHost::CreateBrowser(info, cef32_handler, CefString("about:blank"), settings, nullptr, nullptr);

在CWebView::OnSize(UINT nType, int cx, int cy)中控制大小适应窗口

if(cef32_handler.get() && cx > 0 && cy > 0)
	{
		CefRefPtr<CefBrowser>browser = cef32_handler->GetBrowser();
		if(browser)
		{
			CefWindowHandle hWnd = browser->GetHost()->GetWindowHandle();
			if(::IsWindow(m_hWnd)) ::MoveWindow(hWnd, 0, 0, cx, cy, true); 
		}
	}

在CMyApp::ExitInstance()中退出CEF

	CefQuitMessageLoop();
	CefShutdown();

Debug版本使用CefShutdown()会在debug.log中产生错误报告,Release发行版会忽略。

运行时所需的文件如下:

文件名 类型 说明
locales folder 本地化资源。CefSettings.locale指定需要加载的pak文件,只需要发布配置的区域对应的pak文件
cef.pak file 这些文件包含了供CEF使用的区域无关资源,缺少这些文件任意Web组件可能显示不正确
cef_100_percent.pak file 同上
cef_200_percent.pak file 同上
cef_extensions.pak file 此文件包含扩展加载所需的非本地化资源传递--disable-extensions命令行标志来禁止使用文件。没有这个文件,依赖于扩展系统的组件将不起作用, 如PDF查看器
chrome_elf.dll file Crash reporting library,崩溃报告
d3dcompiler_43.dll 或 d3dcompiler_47.dll file Windows XP/Vista和更高版本的系统需要该文件
devtools_resources.pak file 此文件包含Chrome开发者工具所需的非本地化资源,缺少这个文件,Chrome开发者工具将无法运行
icudtl.dat file 用来支持unicode,缺少这些文件虽然编译能通过,但是执行CefInitialize();的时候就会崩溃
libcef.dll file 核心库,要区分Debug和Release
libEGL.dll file Direct3D支持文件,如果缺少这些文件,HTML5在渲染2D画布,3D CSS,WebGL时将不起作用
libGLESv2.dll file 同上
snapshot_blob.bin file V8引擎快照数据
v8_context_snapshot.bin file 同上

注:V8引擎是一种JavaScript运行引擎,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。

相关标签: c++ CEF