文章目录

  • 1.新建MFC项目
  • 2.添加cefsimple中的文件
  • 3.取消预编译头文件
  • 4.添加包含文件和库文件
    • 4.1 头文件夹
    • 4.2 库文件夹
  • 5.修改部分错误
    • 5.1 编译错误
  • 6.添加代码
    • 6.1.修改浏览器窗口位置
    • 6.2.目标位置加入代码
  • 7.加入manifest文件
  • 8.最终效果
  • 9.作者答疑

  MFC作为传统的C++框架,在许多现有的windows应用程序中,还是大量存在,在如今的互联网世界里,web已经成为了不可或缺的一环,通过html5展示页面是一种非常方便而有效的技术。这样,将浏览器作为一个子窗口嵌入到mfc中,有大量的需求存在。本文展示如何将cef浏览器嵌入mfc中运行,并打开一个网页。本文测试环境采用VS2017+chromium-79.0.3945.88_windows64测试。

1.新建MFC项目

  在VS2017中新建MFC对话框项目,如下图所示:

2.添加cefsimple中的文件

  找到项目中对应文件,拷贝至MFC所在项目,如下图所示:

  将对应文件添加至解决方案,如下图所示:

3.取消预编译头文件

4.添加包含文件和库文件

  将包含文件和库路径添加至当前项目属性,头文件是项目文件夹下的include文件夹。

4.1 头文件夹


4.2 库文件夹

  本文将编译好的libcef_dll_wrapper.lib和debug对应其他资源文件整理在一个目录,如下所示:
  mfc项目添加库路径和库文件。如下图所示:

添加库文件:

libcef.lib
libcef_dll_wrapper.lib
opengl32.lib
comctl32.lib
rpcrt4.lib
shlwapi.lib
ws2_32.lib
d3d11.lib
glu32.lib
imm32.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib

5.修改部分错误

5.1 编译错误

bool ReadFileToString(const std::string& path,std::string* contents,size_t max_size = std::numeric_limits<size_t>::max());
//warning C4003: 类函数宏的调用“max”参数不足
//改为--添加括号
bool ReadFileToString(const std::string& path,std::string* contents,size_t max_size = (std::numeric_limits<size_t>::max)());int transfer_size =std::min(bytes_to_read, static_cast<int>(data_.length() - offset_));
//error C2589: “(”:“::”右边的非法标记
//改为--添加括号int transfer_size =(std::min)(bytes_to_read, static_cast<int>(data_.length() - offset_));   DCHECK_EQ((std::max)(image->GetWidth(), image->GetHeight()), 16U);//添加括号

6.添加代码

6.1.修改浏览器窗口位置

  将simple_app.cc文件中的以下内容去除,这部分内容是显示浏览器窗口使用。

void SimpleApp::OnContextInitialized() {CEF_REQUIRE_UI_THREAD();CefRefPtr<CefCommandLine> command_line =CefCommandLine::GetGlobalCommandLine();#if defined(OS_WIN) || defined(OS_LINUX)// Create the browser using the Views framework if "--use-views" is specified// via the command-line. Otherwise, create the browser using the native// platform framework. The Views framework is currently only supported on// Windows and Linux.const bool use_views = command_line->HasSwitch("use-views");
#elseconst bool use_views = false;
#endif// SimpleHandler implements browser-level callbacks.CefRefPtr<SimpleHandler> handler(new SimpleHandler(use_views));// Specify CEF browser settings here.CefBrowserSettings browser_settings;std::string url;// Check if a "--url=" value was provided via the command-line. If so, use// that instead of the default URL.url = command_line->GetSwitchValue("url");if (url.empty())url = "http://www.baidu.com";if (use_views) {// Create the BrowserView.CefRefPtr<CefBrowserView> browser_view = CefBrowserView::CreateBrowserView(handler, url, browser_settings, NULL, NULL, NULL);// Create the Window. It will show itself after creation.CefWindow::CreateTopLevelWindow(new SimpleWindowDelegate(browser_view));} else {// Information used when creating the native window.CefWindowInfo window_info;#if defined(OS_WIN)// On Windows we need to specify certain flags that will be passed to// CreateWindowEx().window_info.SetAsPopup(NULL, "test simple cef");
#endif// Create the first browser window.CefBrowserHost::CreateBrowser(window_info, handler, url, browser_settings,NULL, NULL);}
}

6.2.目标位置加入代码

  在MFC中InitInstance函数内加入代码:

BOOL CMFCCefApp::InitInstance()
{   /*m_cefApp = new client::ClientAppBrowser();if (!(m_cefApp->Init(m_hInstance) < 0))return FALSE;*///参数初始化CefMainArgs main_args(m_hInstance);CefRefPtr<SimpleApp> app(new SimpleApp);int exit_code = CefExecuteProcess(main_args, app.get(), NULL);if (exit_code >= 0) {// The sub-process has completed so return here.return FALSE;}CefSettings settings;settings.no_sandbox = true;settings.multi_threaded_message_loop = true;   CefInitialize(main_args, settings, app.get(), NULL);// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControlsEx()。  否则,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 创建 shell 管理器,以防对话框包含// 任何 shell 树视图控件或 shell 列表视图控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 标准初始化// 如果未使用这些功能并希望减小// 最终可执行文件的大小,则应移除下列// 不需要的特定初始化例程// 更改用于存储设置的注册表项// TODO: 应适当修改该字符串,// 例如修改为公司或组织名SetRegistryKey(_T("应用程序向导生成的本地应用程序"));CMFCCefDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置处理何时用//  “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){// TODO: 在此放置处理何时用//  “取消”来关闭对话框的代码}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 删除上面创建的 shell 管理器。if (pShellManager != nullptr){delete pShellManager;}#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)ControlBarCleanUp();
#endif// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,//  而不是启动应用程序的消息泵。return FALSE;
}

  在退出函数中加入代码:

int CMFCCefApp::ExitInstance()
{// TODO: 在此添加专用代码和/或调用基类CefShutdown();return CWinApp::ExitInstance();
}

  在窗口显示中加入代码:

CefRefPtr<SimpleHandler> g_handler;
BOOL CMFCCefDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标CefRefPtr<SimpleHandler> _handler(new SimpleHandler(false));g_handler = _handler;CefWindowInfo window_info;CRect rect;GetWindowRect(&rect);window_info.SetAsChild(m_hWnd, rect);//window_info.SetAsPopup(NULL, "hello");CefBrowserSettings browser_settings;CefBrowserHost::CreateBrowser(window_info, g_handler.get(), "http://www.baidu.com", browser_settings, NULL, NULL);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

  在窗口大小变动消息中加入代码:

void CMFCCefDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码if (g_handler.get()){CefWindowHandle hwnd = g_handler->GetBrowser()->GetHost()->GetWindowHandle();CRect rc;GetClientRect(rc);::MoveWindow(hwnd, rc.left, rc.top, rc.Width(), rc.Height(), true);}
}

7.加入manifest文件

  以上做完之后,在测试的时候发现浏览器显示空白,需要加入manifest文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">  <application> <!--The ID below indicates application support for Windows 8.1 -->  <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>  <!-- 10.0 -->  <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility>
</assembly>

  在项目属性,清单工具,输入输出中,指定刚刚新建的cef.manifest文件。重新生成,即可显示目标网页。

8.最终效果

9.作者答疑


  如有疑问,请留言。

libcef-案例展示-将cef浏览器嵌入到mfc中作为子窗口运行相关推荐

  1. 火狐浏览器中打开java_将Firefox浏览器嵌入Java Swing中

    小编典典 这是一些示例代码 import java.awt.Color; import java.awt.Component; import java.awt.Container; import ja ...

  2. MFC应用程序中嵌入一个谷歌cef浏览器

    声明:文章来自http://www.codeproject.com/Articles/1105945/Embedding-a-Chromium-browser-in-an-MFC-applicatio ...

  3. html 漂浮浏览器,HTML5浏览器嵌入窗口程序解决方案 | Hoverlees#39; Blog

    September 22, 2012 分类:ASM/C/C++     作者:hoverlees 浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供 ...

  4. Cef开发学习 - Windows平台简易的Cef浏览器,支持下载管理和多标签管理

    Cef开发学习 - Windows平台简易的Cef浏览器,支持下载管理和多标签管理 PS:本系列文章主要学习介绍Cef开发相关的内容. 文章目录 Cef开发学习 - Windows平台简易的Cef浏览 ...

  5. MFC对话框应用程序中谷歌CEF浏览器内核的使用

    MFC对话框应用程序中谷歌CEF浏览器内核的使用 最近在做一个与浏览器相关的MFC项目,用户要求使用IE和谷歌双内核.对于IE内核可以直接使用MFC中的ACTIVEX控件,但是对于谷歌浏览器内核却并没 ...

  6. simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...

    安世亚太官方订阅号(搜索:peraglobal)将为您提供CAE仿真.工业先进设计与增材制造领域最新的行业资讯.专业的课程培训.权威的技术资料.丰富的案例分析 随着金属增材制造过程仿真分析工具功能的进 ...

  7. 星型模型 3nf的区别_贵州省遵义市工业模型经典案例展示

    随着城市的发展,沙盘模型在城市建设中发展着越来越重要的作用.地产商在开发一个片区时候,都会首先和一些专业的沙盘模型公司联系,用以来构建未来的的展现效果.那平时制作沙盘模型都有哪些方法,都使用了哪些原料 ...

  8. solr使用网页浏览器批量导入数据库中数据(本案例是mysql)

    如果想要知道如何安装solr,集成IKAnalyzer中文分词器,批量导入数据库数据,java使用参照以下本博主博文: 安装solr https://blog.csdn.net/u013294097/ ...

  9. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  10. 火山视窗CEF浏览器用网页框架操作实现取本机IP、地址

    本源码转载自利快云https://www.lkuaiy.com/ 火山视窗CEF浏览器用网页框架操作实现取本机IP.地址   一.准备工作 在网页中存在一种名叫"框架"的元素,具体 ...

最新文章

  1. HomeZZ注册推介码
  2. 当当的羊毛又该剪了!官方活动基础上的额外优惠券,速领!
  3. TortoiseSVN搭载
  4. 基于MATLAB的IIR滤波器设计与实现
  5. 如何通俗的理解KKT条件
  6. 用英语回答问题 - 一个SAP开发人员为什么要练习双截棍
  7. 小程序 省市区县三级联动选择器(caseCade)
  8. C++之运算符重载(上)
  9. 成为Google认证机器学习工程师,零基础只需要2步?
  10. 反复出现的PSW木马, 附日志,请高手指点
  11. java 字符串比较 == equals_Java在比较字符串的时候,equals 与== 完全一样呀?
  12. C# 4.0中对Office编程的预览和对可选参数的体验
  13. 开启 C++ 生活 -- 第一个 C++ 程序
  14. formData:解决formData使用append追加后console仍为空
  15. 任意一个c语言程序实例,C语言程序实例大全下载-C语言程序设计实例大全 - 河东下载站...
  16. 【Numpy】np.stack()最通俗易懂解释
  17. 备战2018|春招or跳槽?大学生和职场新人最后的机会!
  18. vim 下 :normal模式
  19. 机器自动翻译古文拼音 - 十大宋词 - 念奴娇 赤壁怀古 苏轼
  20. 腾达无线路由器网关和域名服务器,腾达(Tenda)FH329路由器固定(静态)IP设置上网...

热门文章

  1. matlab求列主元lu分解,列主元LU分解
  2. Android接入融云即时通讯SDK,实现单聊和发送自定义消息。
  3. uni-app商城源码/公众号/小程序/APP多端适配
  4. 数据分析 | 异常数据识别小结
  5. 数列求和再求极限问题
  6. 语音助手——简介与交互过程
  7. 体脂数C语言switch,你真胖么 体脂率是什么 体脂率的计算方法
  8. AECC2019免费下载After Effects CC 2019中文完整破解版免费下载与安装教程...
  9. java 微信公众号消息推送 微信发送消息
  10. lisp医院化验系统_医院管理系统(his)电子病历 体检系统 l is pacs