从零开始:用 CEF3+MFC 打造简易浏览器
本文介绍了如何基于CEF3和MFC框架快速搭建简易浏览器。CEF3是Chromium嵌入式框架,可集成Chrome渲染能力;MFC提供Windows GUI开发支持。开发步骤包括:1)环境准备;2)在InitInstance函数中初始化CEF3;3)在OnInitDialog创建浏览器窗口;4)程序退出时释放资源。重点在于处理CEF多进程架构、配置参数和窗口绑定。文章还提供了常见问题解决方案,并建
静态库下载地址:https://www.ikdya.com/2026/03/24/524.html
作为一名 C++ 开发者,想必你也想过自己动手实现一个轻量的浏览器。今天就和大家分享如何基于 CEF3(Chromium Embedded Framework)结合 MFC 框架,快速搭建一个简易的浏览器应用,全程干货,新手也能跟着做!
软件效果图

一、什么是 CEF3?
CEF3 是基于 Chromium 内核的嵌入式浏览器框架,它允许我们将 Chrome 的网页渲染能力无缝集成到 C++ 应用中。简单来说,就是把 Chrome 的核心功能 “抠出来”,放到我们自己的 MFC 程序里,不用从零开发浏览器内核,大大降低了开发成本。
MFC 则是微软的基础类库,提供了成熟的窗口、控件等 GUI 开发能力,两者结合既能利用 CEF3 的强大渲染能力,又能借助 MFC 快速搭建 Windows 桌面应用界面。
二、核心开发步骤
1. 环境准备(前置条件)
- 开发工具:Visual Studio(2019/2022 均可)
- CEF3 库:下载对应版本的 CEF3 二进制包(建议 x64 版本),并配置到项目的包含目录、库目录中
- 项目类型:MFC 对话框应用(方便快速上手)
- libcef_dll_wrapper.lib库需要自己编译 官方没有提供编译版本如果不会具体参考https://www.ikdya.com/2026/03/23/518.html 或本上上方直接下载我提供的编译版本 注意我编译的是145.0.7632.160 需要下载对应的版本CEF3配合使用
2. 关键初始化:InitInstance 函数
MFC 程序的入口核心是InitInstance函数,我们需要在这里完成 CEF3 的初始化,这是整个浏览器功能的基础。
// 核心初始化代码
BOOL CMFC_WebBrowserApp::InitInstance()
{
// 省略MFC默认初始化代码...
// 1. 构造CEF主进程参数
CefMainArgs mainArgs(AfxGetInstanceHandle());
CefRefPtr<CSimpleApp> app(new CSimpleApp());
// 2. 处理CEF子进程(关键!CEF运行需要主进程+子进程)
int exitCode = CefExecuteProcess(mainArgs, app.get(), nullptr);
if (exitCode >= 0) {
// 如果是子进程,直接退出(子进程无需走MFC逻辑)
if (pShellManager != nullptr) {
delete pShellManager;
}
return FALSE;
}
// 3. 配置CEF运行参数(根据需求调整)
CefSettings settings;
settings.multi_threaded_message_loop = true; // CEF自主管理消息循环,避免和MFC冲突
settings.no_sandbox = true; // 开发阶段禁用沙箱(必须,否则会启动失败)
settings.windowless_rendering_enabled = false; // 启用窗口渲染(可视化显示网页)
// 缓存路径(绝对路径,建议配置,提升网页加载性能)
CefString(&settings.cache_path) = L"D:\\C++\\MFC_WebBrowser\\x64\\Release\\cache";
// 日志配置(方便调试排错)
CefString(&settings.log_file) = L"D:\\C++\\MFC_WebBrowser\\x64\\Release\\cef.log";
settings.log_severity = LOGSEVERITY_WARNING; // 只记录警告/错误,减少日志量
// 配置中文环境
CefString(&settings.locale) = L"zh-CN";
// 4. 初始化CEF核心
if (!CefInitialize(mainArgs, settings, app.get(), nullptr)) {
AfxMessageBox(TEXT("CEF 初始化失败!请检查相关文件是否完整。"));
if (pShellManager != nullptr) {
delete pShellManager;
}
return FALSE;
}
// 省略MFC窗口创建代码...
return TRUE;
}
代码关键说明:
CefExecuteProcess:CEF 采用多进程架构,这个函数会判断当前进程是主进程还是子进程,子进程直接退出即可CefSettings:核心配置项,no_sandbox=true是开发阶段的必选项(发布时可根据需求开启),multi_threaded_message_loop=true能避免 CEF 和 MFC 的消息循环冲突- 路径配置:必须用绝对路径,否则 CEF 无法找到缓存 / 日志目录
3. 创建浏览器窗口:OnInitDialog 函数
初始化完成后,在对话框的OnInitDialog函数中创建浏览器实例,让网页显示在 MFC 窗口中。
BOOL CMFC_WebBrowserDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 省略MFC默认初始化代码...
// 1. 配置浏览器窗口信息(绑定到MFC对话框的某个控件/区域)
CefWindowInfo windowInfo;
// 获取对话框中用于显示网页的控件句柄(比如一个静态文本控件,ID为IDC_STATIC_BROWSER)
HWND hBrowserWnd = GetDlgItem(IDC_STATIC_BROWSER)->GetSafeHwnd();
windowInfo.SetAsChild(hBrowserWnd, CRect(0, 0, 800, 600)); // 设置浏览器显示区域大小
// 2. 浏览器基础设置
CefBrowserSettings browserSettings;
// 3. 创建浏览器实例,加载指定URL
CefBrowserHost::CreateBrowser(
windowInfo, // 窗口绑定信息
nullptr, // 客户端处理器(后续可扩展,比如处理网页事件)
L"https://www.baidu.com", // 初始加载的URL
browserSettings, // 浏览器配置
nullptr, // 附加信息
nullptr // 请求上下文
);
return TRUE;
}
代码关键说明:
CefWindowInfo::SetAsChild:将 CEF 浏览器嵌入到 MFC 的指定控件中,实现 “网页嵌入桌面窗口” 的效果CefBrowserHost::CreateBrowser:核心创建函数,传入初始 URL(比如百度)后,运行程序就能看到网页了
4. 收尾工作:退出时释放 CEF 资源
在程序退出时,需要正确释放 CEF 资源,避免内存泄漏:
int CMFC_WebBrowserApp::ExitInstance()
{
// 等待CEF所有进程退出
CefShutdown();
return CWinApp::ExitInstance();
}
三、运行效果与扩展方向
1. 基础效果
编译运行后,你会看到一个 MFC 窗口,里面显示百度首页,支持网页的点击、输入、跳转等基础操作,一个简易浏览器就成型了!
2. 扩展方向(新手友好)
- 地址栏:添加编辑框,实现 “输入 URL 回车跳转” 功能
- 前进 / 后退按钮:调用 CEF 的
CefBrowser::GoForward()/GoBack()接口 - 刷新按钮:调用
CefBrowser::Reload()接口 - 网页事件监听:自定义
CefClient子类,监听网页加载、弹窗、右键菜单等事件
四、常见问题解决
- 启动崩溃:检查 CEF 库是否配置完整(需要将 CEF 的 dll、资源文件放到程序运行目录),确保
no_sandbox=true - 网页不显示:检查
SetAsChild的控件句柄是否有效,窗口区域大小是否合理 - 中文乱码:确保
settings.locale = L"zh-CN",且网页本身支持中文编码
总结
- CEF3+MFC 实现简易浏览器的核心是:在
InitInstance初始化 CEF(处理多进程、配置参数),在OnInitDialog创建浏览器实例并绑定到 MFC 窗口。 - CEF3 的多进程架构是关键,
CefExecuteProcess必须优先调用,否则程序无法正常运行。 - 开发阶段务必禁用沙箱(
no_sandbox=true),路径配置需使用绝对路径,避免初始化失败。
这个小项目既能帮我们理解 CEF3 的嵌入式原理,也能巩固 MFC 的窗口开发知识,新手可以从基础功能入手,逐步扩展成更完善的浏览器工具。如果有问题,欢迎在评论区交流
更多推荐



所有评论(0)