嵌入Chrome cef到MFC CView
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
公司项目中一直存在着一个CHtmlView模块来显示URL,但是随着web页面的更新(加入HTML5 and 其它一些比较新的技术)越来越发现使用CHtmlView已经无法满足目前的需求。开始还是试着去修改一些东西去满足当前需要,不过好景不长终于有一天CHtmlView连我们目前的web页面都打不开了,于是决定采用Chrome来作为浏览器引擎。
嵌入到MFC
使用CEF
首先,需要下载CEF框架。其中包含了一个使用CEF的例子。目前的CEF共有3个版本(详情见:http://code.google.com/p/chromiumembedded/downloads/list):
CEF1:单线程的浏览器框架
CEF2:已放弃开发
CEF3:多线程浏览器框架
在这里使用的是CEF1来构建我们的程序。
下载好CEF框架后,打开CEF工程文件找到并编译libcef_dll_wrapper项目(cefclient是一个可运行的例子,有兴趣的朋友可以研究研究)就可以了。
创建我们的CWebView
创建好工程后我们需要连接下面这两个静态库:
\cef_binary\Debug\Lib\libcef_dll_wrapper.lib
\cef_binary\lib\Debug\libcef.lib
要与浏览器交互我们需要创建一个CefClient的子类,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#pragma once #include <cef_client.h> class CWebClient : public CefClient , public CefLifeSpanHandler { protected: CefRefPtr<CefBrowser> m_Browser; public: CWebClient(void){}; virtual ~CWebClient(void){}; CefRefPtr<CefBrowser> GetBrowser() { return m_Browser; } virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE { return this; } virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE; // 添加CEF的SP虚函数 IMPLEMENT_REFCOUNTING(CWebClient); IMPLEMENT_LOCKING(CWebClient); }; |
接下来就开始修改我们的视图类了:
创建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// CWebView message handlers int CWebView::OnCreate( LPCREATESTRUCT lpCreateStruct ) { if ( CView::OnCreate(lpCreateStruct) == -1) return -1; CefRefPtr<CWebClient> client(new CWebClient()); m_cWebClient = client; CefSettings cSettings; CefSettingsTraits::init( &cSettings); cSettings.multi_threaded_message_loop = true; CefRefPtr<CefApp> spApp; CefInitialize( cSettings, spApp); CefWindowInfo info; info.SetAsChild( m_hWnd, CRect(0, 0, 800, 600)); CefBrowserSettings browserSettings; CefBrowser::CreateBrowser( info, static_cast<CefRefPtr<CefClient> >(client), "http://192.168.1.21:8080/dialysis/web/page/nav/content.jsp", browserSettings); return 0; } |
调整大小:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void CWebView::OnSize( UINT nType, int cx, int cy ) { CView::OnSize(nType, cx, cy); if(m_cWebClient.get()) { CefRefPtr<CefBrowser> browser = m_cWebClient->GetBrowser(); if(browser) { CefWindowHandle hwnd = browser->GetWindowHandle(); RECT rect; this->GetClientRect(&rect); // ::SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, SWP_NOZORDER); ::MoveWindow( hwnd, 0, 0, cx, cy, true); } } } |
如果在编译CWebView出现连接错误可以把libcef_dll_wrapper工程的Runtime Library修改为Multi-threaded Debug DLL (/MDd) 并将Treat warnings as errors修改为No (/WX-)试试。
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=744