静态库下载地址: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子类,监听网页加载、弹窗、右键菜单等事件

四、常见问题解决

  1. 启动崩溃:检查 CEF 库是否配置完整(需要将 CEF 的 dll、资源文件放到程序运行目录),确保no_sandbox=true
  2. 网页不显示:检查SetAsChild的控件句柄是否有效,窗口区域大小是否合理
  3. 中文乱码:确保settings.locale = L"zh-CN",且网页本身支持中文编码

总结

  1. CEF3+MFC 实现简易浏览器的核心是:在InitInstance初始化 CEF(处理多进程、配置参数),在OnInitDialog创建浏览器实例并绑定到 MFC 窗口。
  2. CEF3 的多进程架构是关键,CefExecuteProcess必须优先调用,否则程序无法正常运行。
  3. 开发阶段务必禁用沙箱(no_sandbox=true),路径配置需使用绝对路径,避免初始化失败。

这个小项目既能帮我们理解 CEF3 的嵌入式原理,也能巩固 MFC 的窗口开发知识,新手可以从基础功能入手,逐步扩展成更完善的浏览器工具。如果有问题,欢迎在评论区交流

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐