设为首页收藏本站

CEF中文交流论坛-- ceffans.com

 找回密码
 立即注册
搜索
查看: 26695|回复: 2

CEF嵌入MFC工程实例

[复制链接]

5

主题

10

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2016-10-30 15:34:49 | 显示全部楼层 |阅读模式
环境:系统:Windows 7

编译工具:Visual Studio 2008 + SP1
CEF版本:cef_binary_3.2171

工程前期准备:       首先,cef_binary_3.2171使用CMark生成.sln文件,双击打开cef.sln文件编译生成lib_dll_wrapper.lib跟对应的动态库lib_dll_wrapper.dll(工程原本属性是MTd的,我在自己的工程中使用的MDd的)
       其次,将生成的lib跟以及头文件整合一下,放在同一文件夹(方便后期工程链接使用)       目录结构如QQ截图20161030153455.png图所示:
       再次,将cef_binary_3.2171解压包中cefclient中的下列文件复制出来放到新建的cefclient文件夹下(方便后期工程使用)
       文件列表如文件1.png 文件2.png所示:
      
      

创建工程集成cef:

  打开VS2008创建一个MFC对话框工程;
  将cefclient复制到工程源文件目录下:  如图cefclient位置.png 所示  

  然后就是设置工程属性:  打开项目属性:
在C/C++-常规-附加包含目录选项中选择包含目录(由于我的2171Lib文件夹跟工程师在同一目录下,所以我的设置  "../../2171Lib;.\" )
在链接器-常规-附加库目录中选择包含目录(我自己工程为:../../2171Lib/Debug)
在链接器-输入-附加依赖项中添加链接的静态的库(也可以在工程中通过代码控制,我自己工程为:libcef.lib libcef_dll_wrapper.lib cef_sandbox.lib)

至此,我们工程的配置基本都已经搞掂了,下边就是在工程中写代码展示cef窗口了

在工程的CXXApp类的InitInstance跟        ExitInstance中进行cef的初始化跟反初始化操作了

在CXXApp.cpp中包含以下文件
  1. #include "cefclient/client_app.h"
  2. #include "cefclient/cefclient.h"
  3. #include "cefclient/client_switches.h"
复制代码

初始化:
  1.   CefRefPtr<ClientApp>app(new ClientApp);
  2.         CefMainArgs main_args(m_hInstance);
  3.         int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
  4.         if (exit_code >= 0)
  5.                 return exit_code;
  6.         CefSettings settings;
  7.         settings.single_process=false;
  8.         settings.multi_threaded_message_loop =true;
  9.         settings.no_sandbox=true;
  10.         settings.remote_debugging_port=1024;
  11.         //初始化CEF
  12.         CefInitialize(main_args, settings, app.get(), NULL);
复制代码
反初始化:
  1. int CCEFDemo1App::ExitInstance()
  2. {
  3.         // TODO: 在此添加专用代码和/或调用基类
  4.         CefShutdown();
  5.         return CWinAppEx::ExitInstance();
  6. }
复制代码

接下来就可以在CXXDlg窗口中创建、展示cef窗口了
在CXXDlg.cpp文件中添加以下头文件
  1. #include "include/cef_app.h"
  2. #include "include/cef_browser.h"
  3. #include "include/cef_frame.h"
  4. #include "cefclient/client_handler.h"
  5. #include "cefclient/cefclient_osr_widget_win.h"
  6. #include "cefclient/client_switches.h"
  7. #include "cefclient/scheme_test.h"
  8. #include "cefclient/string_util.h"
复制代码
另外,定义一个全局的cef对象
  1. extern CefRefPtr<ClientHandler> g_handler;
复制代码


然后在窗口的WM_CREATE消息的响应函数OnCreate中创建cef,代码如下:
  1. int CCEFDemo1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.         if (CDialog::OnCreate(lpCreateStruct) == -1)
  4.                 return -1;

  5.         // TODO:  在此添加您专用的创建代码
  6.         CRect rcClient;
  7.         GetClientRect(&rcClient);
  8.         g_handler = new ClientHandler();
  9.         CefWindowInfo window_info;
  10.         window_info.SetAsChild(m_hWnd, rcClient);
  11.         CefBrowserSettings cbs;
  12.         cbs.web_security = STATE_DISABLED;  // 降低页面安全性设置,允许跨域加载资源
  13.         CefBrowserHost::CreateBrowser(window_info,
  14.                 g_handler.get(),
  15.                 _T("www.ceffans.com"), cbs, NULL);

  16.         return 0;
  17. }
复制代码
如果需要cef的窗口随着其寄主窗口的大小自动调节,只需在寄主窗口的WM_SIZE消息的响应函数OnSize中添加以下代码即可:
  1. CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
  2.         if (browser)
  3.         {
  4.                 CefWindowHandle hwnd = browser->GetHost()->GetWindowHandle();
  5.                 ::MoveWindow(hwnd, 0, 0, cx, cy, FALSE);
  6.         }
复制代码



然后编译运行,我们就可以看到cef嵌入到mfc窗口的效果了;


我自己写的Demo下载地址为:
http://pan.baidu.com/s/1eSaAyaA   里边的cefDemo.zip这个文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
赠人玫瑰,手有余香
汪国真说:"获得是一种满足,给予是一种快乐。"
回复

使用道具 举报

5

主题

10

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
 楼主| 发表于 2016-10-31 10:52:32 | 显示全部楼层
在工程的属性中还要添加一个opengl32.lib

如果vs中没有opengl就下载一个然后加入到vs目录中
赠人玫瑰,手有余香
汪国真说:"获得是一种满足,给予是一种快乐。"

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2016-11-3 22:17:20 | 显示全部楼层
楼主,请教个问题,今天使用 devtools 的时候,出现一个蛋疼的问题:停断点的时候,devtools窗口点击任何位置都不起作用,请问遇到过该问题吗?感觉是使用方式不对(直接使用 ShowDevTools 弹出的调试窗口),查阅了很多资料,无解,能不能先出一篇这样的帖子来瞻仰瞻仰?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|ceffans.com ( 浙ICP备16037727号  

GMT+8, 2017-6-24 15:14 , Processed in 0.137852 second(s), 25 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表