VS2019 MFC中使用CEF
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的工程,步骤如下:
- 选择好源和目的文件夹
- 配置生成器为Visual Studio 16 2019
- 生成目标环境
- 使用VS2019打开工程
编译工程,注意选择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引擎下的运行速度媲美二进制程序。
上一篇: day27 线程同步
下一篇: 第一模块:Python介绍(一)