位置: IT常识 - 正文

【小沐学C++】C++ MFC中嵌入web网页控件(WebBrowser、WebView2、CEF3)

发布时间:2024-01-16
【小沐学C++】C++ MFC中嵌入web网页控件(WebBrowser、WebView2、CEF3) 文章目录1、简介2、WebBrowser2.1 新建测试项目2.2 添加web控件类文件2.3 添加web控件变量2.4 添加窗口事件2.5 添加web控件实例创建代码2.6 编译和运行3、WebView23.1 新建测试项目3.2 下载和安装WebView2包3.3 添加web控件代码3.4 编译和运行4、CEF34.1 下载cef34.2 编译和运行cef3结语1、简介

推荐整理分享【小沐学C++】C++ MFC中嵌入web网页控件(WebBrowser、WebView2、CEF3),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

WebBrowser控件最常见的用途之一是向应用程序添加 Internet 浏览功能。使用 IWebBrowser2 接口,可以浏览到本地文件系统、网络或万维网上的任何位置。可以使用IWebBrowser2::Navigate 方法告知控件要浏览到哪个位置。第一个参数是包含位置名称的字符串。要浏览到本地文件系统或网络上的某个位置,请指定文件系统位置的完整路径或网络上该位置的 UNC 名称。若要浏览到万维网上的某个站点,请指定该站点的 URL。

2、WebBrowser

To add the WebBrowser control to a basic Microsoft Foundation Classes (MFC) application, perform the following steps.

Right-click the Project name, and point to Add, the select Class… from the context menu.Select “MFC Class From ActiveX Control” and click Add.Select “Microsoft Web Browser” from among the classes listed in the registry. Highlight the IWebBrowser2 interface, and click the right arrow to generate a new CWebBrowser2 class.Click Finish.2.1 新建测试项目

选择模板:Visual C++ -> MFC应用程序,如下: 选择:单个文档 创建的项目文件如下:

2.2 添加web控件类文件

在项目“MFCApplication9”上鼠标右键,在菜单里选择“类向导。。。” 在弹窗“类向导”中选择ActiveX控件中的MFC类。 安装如下的提示,选择Microsoft Web Browser<1.0>. 按照如下提示,选择IWebBrowser2。然后点击按钮完成。 然后自动在项目中生成控件的类文件如下:

2.3 添加web控件变量

在文件MFCApplication9View.h中添加代码如下:

#include "CWebBrowser2.h"CWebBrowser2 *m_pBrowser;

2.4 添加窗口事件

对CMFCApplication9View视图类添加窗口事件:WM_CREATE,WM_SIZE

int CMFCApplication9View::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专用的创建代码return 0;}void CMFCApplication9View::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码}

2.5 添加web控件实例创建代码

在上面的两个事件函数里添加对应的代码:

void CMFCApplication9View::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);if (m_pBrowser) {m_pBrowser->MoveWindow(0, 0, cx, cy);}// TODO: 在此处添加消息处理程序代码}int CMFCApplication9View::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: 在此添加您专用的创建代码// Create the control.m_pBrowser = new CWebBrowser2;ASSERT(m_pBrowser);if (!m_pBrowser->Create(NULL, NULL, WS_VISIBLE, CRect(0, 0, 0, 0), this, NULL)){TRACE("failed to create browser/n");delete m_pBrowser;m_pBrowser = NULL;return 0;}// Initialize the first URL.COleVariant noArg;CString strURL("https://image.baidu.com/");//CString strURL("https://cn.bing.com/");m_pBrowser->Navigate(strURL, &noArg, &noArg, &noArg, &noArg);return 0;}2.6 编译和运行

3、WebView2

Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。

支持以下编程环境:

Win32 C/C++.NET Framework 4.5 或更高版本.NET Core 3.1 或更高版本.NET 5.NET 6WinUI 2.0WinUI 3.03.1 新建测试项目

新建一个MFC的项目如上。

3.2 下载和安装WebView2包【小沐学C++】C++ MFC中嵌入web网页控件(WebBrowser、WebView2、CEF3)

通过菜单“项目”-“管理NuGet程序包”,下载相关包。 在“浏览”分页的左上角的搜索栏中,键入 Microsoft.Web.WebView2。 或者,复制并粘贴下面的单行代码块。 然后选择“ Microsoft.Web.WebView2”。以及在右侧选择对应的版本,然后点击按钮安装。 自动弹窗下载提示框,点击确定按钮。 输出下载的日志信息。 在项目的代码文件夹里会自动创建子文件夹packages,里面保存了下载的相关包文件夹:Microsoft.Web.WebView2.1.0.902.49 再下另一个包:Microsoft.Windows.ImplementationLibrary。

稍后,你将安装 Windows 实现库 (WIL) - 仅限标头的 C++ 库,通过适用于 Windows COM 编码模式的可读、类型安全的 C++ 接口,使 Windows 上的开发人员的生活更加轻松。 可通过 Visual Studio 中的 解决方案资源管理器 为项目安装此 Microsoft.Windows.ImplementationLibrary 包。

在 “NuGet” 窗口中,单击“ 浏览 ”选项卡。在左上角的搜索栏中,键入 Microsoft.Windows.ImplementationLibrary。 或者,复制并粘贴下面的单行代码块。 然后选择 “Microsoft.Windows.ImplementationLibrary”。 同样在项目文件夹里会下载子文件夹:Microsoft.Windows.ImplementationLibrary.1.0.191107.2 项目文件夹的文件packages.config:

<?xml version="1.0" encoding="utf-8"?><packages> <package id="Microsoft.Web.WebView2" version="1.0.902.49" targetFramework="native" /> <package id="Microsoft.Windows.ImplementationLibrary" version="1.0.191107.2" targetFramework="native" /></packages>3.3 添加web控件代码

(1)添加变量和头文件

#include <iostream>#include <wrl.h>#include <wil/com.h>#include "WebView2.h"using namespace Microsoft::WRL;// Pointer to WebViewControllerstatic wil::com_ptr<ICoreWebView2Controller> webviewController;// Pointer to WebView windowstatic wil::com_ptr<ICoreWebView2> webview;

(2)在OnCreate事件函数中添加代码:

int CMFCApplication9View::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;HWND hWnd = this->m_hWnd;// TODO: 在此添加您专用的创建代码// <-- WebView2 sample code starts here -->// Step 3 - Create a single WebView within the parent window// Locate the browser and set up the environment for WebViewCreateCoreWebView2EnvironmentWithOptions(nullptr, nullptr, nullptr,Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>([hWnd](HRESULT result, ICoreWebView2Environment* env) -> HRESULT {// Create a CoreWebView2Controller and get the associated CoreWebView2 whose parent is the main window hWndenv->CreateCoreWebView2Controller(hWnd, Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>([hWnd](HRESULT result, ICoreWebView2Controller* controller) -> HRESULT {if (controller != nullptr) {webviewController = controller;webviewController->get_CoreWebView2(&webview);}// Add a few settings for the webview// The demo step is redundant since the values are the default settingswil::com_ptr<ICoreWebView2Settings> settings;webview->get_Settings(&settings);settings->put_IsScriptEnabled(TRUE);settings->put_AreDefaultScriptDialogsEnabled(TRUE);settings->put_IsWebMessageEnabled(TRUE);// Resize WebView to fit the bounds of the parent windowRECT bounds;::GetClientRect(hWnd, &bounds);webviewController->put_Bounds(bounds);// Schedule an async task to navigate to Bingwebview->Navigate(L"https://www.bing.com/");// <NavigationEvents>// Step 4 - Navigation events// register an ICoreWebView2NavigationStartingEventHandler to cancel any non-https navigationEventRegistrationToken token;webview->add_NavigationStarting(Callback<ICoreWebView2NavigationStartingEventHandler>([](ICoreWebView2* webview, ICoreWebView2NavigationStartingEventArgs* args) -> HRESULT {wil::unique_cotaskmem_string uri;args->get_Uri(&uri);std::wstring source(uri.get());if (source.substr(0, 5) != L"https") {args->put_Cancel(true);}return S_OK;}).Get(), &token);// </NavigationEvents>// <Scripting>// Step 5 - Scripting// Schedule an async task to add initialization script that freezes the Object objectwebview->AddScriptToExecuteOnDocumentCreated(L"Object.freeze(Object);", nullptr);// Schedule an async task to get the document URLwebview->ExecuteScript(L"window.document.URL;", Callback<ICoreWebView2ExecuteScriptCompletedHandler>([](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT {LPCWSTR URL = resultObjectAsJson;//doSomethingWithURL(URL);return S_OK;}).Get());// </Scripting>// <CommunicationHostWeb>// Step 6 - Communication between host and web content// Set an event handler for the host to return received message back to the web contentwebview->add_WebMessageReceived(Callback<ICoreWebView2WebMessageReceivedEventHandler>([](ICoreWebView2* webview, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT {wil::unique_cotaskmem_string message;args->TryGetWebMessageAsString(&message);// processMessage(&message);webview->PostWebMessageAsString(message.get());return S_OK;}).Get(), &token);// Schedule an async task to add initialization script that// 1) Add an listener to print message from the host// 2) Post document URL to the hostwebview->AddScriptToExecuteOnDocumentCreated(L"window.chrome.webview.addEventListener(\'message\', event => alert(event.data));" \L"window.chrome.webview.postMessage(window.document.URL);",nullptr);// </CommunicationHostWeb>return S_OK;}).Get());return S_OK;}).Get());// <-- WebView2 sample code ends here -->return 0;}

(3)在OnSize事件函数中添加代码:

void CMFCApplication9View::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码if (webviewController != nullptr) {RECT bounds;GetClientRect(&bounds);webviewController->put_Bounds(bounds);};}3.4 编译和运行

最后运行的测试程序的界面如下:

4、CEF3

CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目。Google Chromium项目主要是为Google Chrome应用开发的,而CEF的目标则是为第三方应用提供可嵌入浏览器支持。CEF隔离底层Chromium和Blink的复杂代码,并提供一套产品级稳定的API,发布跟踪具体Chromium版本的分支,以及二进制包。CEF的大部分特性都提供了丰富的默认实现,让使用者做尽量少的定制即可满足需求。

4.1 下载cef3

https://cef-builds.spotifycdn.com/index.html 浏览器直接搜索关键词「CEF Automated Builds」找到新的下载站点。

4.2 编译和运行cef3

对于cef来说,只需要把编译出来的libcef_dll_wrapper.lib拿来使用即可,其他文件直接包里的即可。

cef_binary_3.3578.1860.g36610bd_windows32或 cef_binary_88.2.9+g5c8711a+chromium-88.0.4324.182_windows32_minimal

VisualStudio2017、2019编译非常快速,使用CMake对相关代码为例,使用CMake-gui转换,默认是64位版本(如果需要使用32位版本,转换的时候注意选择Win32),转换后的vs工程默认就是Unicode字符集MTd(MT)的,直接编译libcef_dll_wrapper即可,生成的lib拷走,其他的lib直接使用现成的。

创建成功后只编译libcef_dll_wrapper即可,其他lib和资源使用编译好的即可。 尽量链接release版本的,要链接:libcef.lib、cef_sandbox.lib、libcef_dll_wrapper 字符串要传递的时候,需转换为Unicode,可使用std::wstring转换。 cefinitialize崩溃:说明exe执行路径下缺少相关文件导致初始化失败,可以把Resources目录下的locales文件夹、icudtl.dat、cef*.pak等文件复制过来。

通过cmake构建cef的vs工程。

依次点击按钮:“Configure” -> “Generate” -> “Open Project”

生成vs工程文件:

用vs2017打开解决方案文件cef.sln,如下: 其中cefsimple和cefclient是基于win32的实现cef3浏览器的简单示例代码,相对而言,cefsimple比较简单,代码量比较少,mfc中也主要是用这个工程中的文件。 编译和运行,其中cefclient.exe运行如下:

D:\cef_binary88\Release\libcef.libD:\cef_binary88\Release\cef_sandbox.libD:\cef_binary88\Release\libcef_dll_wrapper.lib结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O??? 如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡) 感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文链接地址:https://www.jiuchutong.com/zhishi/297741.html 转载请保留说明!

上一篇:【Linux】rm 命令:删除文件/文件夹(linux rm 命令)

下一篇:js字符串转换为对象格式的3种方法(js字符串转换为数字类型)

  • 美颜相机帮拍模式在哪(美颜相机帮拍模糊怎么办)

    美颜相机帮拍模式在哪(美颜相机帮拍模糊怎么办)

  • 红米note11怎么显示运行内存(红米note11新消息)

    红米note11怎么显示运行内存(红米note11新消息)

  • 快手怎么直播(快手怎么直播放电影)

    快手怎么直播(快手怎么直播放电影)

  • 华为荣耀8x手机贴的什么膜(华为荣耀8x手机屏幕不受控制乱跳)

    华为荣耀8x手机贴的什么膜(华为荣耀8x手机屏幕不受控制乱跳)

  • 小米手环4nfc版支持门禁卡吗(小米手环4nfc版使用教程)

    小米手环4nfc版支持门禁卡吗(小米手环4nfc版使用教程)

  • 如何用usb给笔记本充电(怎么用usb给笔记本充电)

    如何用usb给笔记本充电(怎么用usb给笔记本充电)

  • 华为手机如何设置自动关机(华为手机如何设置时间)

    华为手机如何设置自动关机(华为手机如何设置时间)

  • 美图秀秀怎么去视频水印(美图秀秀怎么去水印)

    美图秀秀怎么去视频水印(美图秀秀怎么去水印)

  • 国际联网是什么意思(国际联网暂行规定实施办法)

    国际联网是什么意思(国际联网暂行规定实施办法)

  • qq扩列冒泡中是什么意思(qq有个扩列)

    qq扩列冒泡中是什么意思(qq有个扩列)

  • 手机最大内存是多少GB(手机最大内存是什么牌子)

    手机最大内存是多少GB(手机最大内存是什么牌子)

  • qq语音通话时怎么设置成静音

    qq语音通话时怎么设置成静音

  • office2019必须装在c盘吗(安装office2019需要卸载office2007吗)

    office2019必须装在c盘吗(安装office2019需要卸载office2007吗)

  • 苹果11怎么显示电池电量百分比(苹果11怎么显示蓝牙耳机电量)

    苹果11怎么显示电池电量百分比(苹果11怎么显示蓝牙耳机电量)

  • 12306怎么看候补人数(12306怎么看候补订单排在第几位)

    12306怎么看候补人数(12306怎么看候补订单排在第几位)

  • ipad声音变耳机模式如何设回(ipad声音变耳机是怎么回事)

    ipad声音变耳机模式如何设回(ipad声音变耳机是怎么回事)

  • 华为手机支付保护有用吗(华为手机支付保护中心收费吗)

    华为手机支付保护有用吗(华为手机支付保护中心收费吗)

  • 免打扰模式怎么解除(免打扰模式怎么关闭)

    免打扰模式怎么解除(免打扰模式怎么关闭)

  • 抖音怎么不让某些人看(抖音怎么不让某人刷到自己)

    抖音怎么不让某些人看(抖音怎么不让某人刷到自己)

  • 小米手环勿扰模式是什么意思(小米手环勿扰模式怎么设置)

    小米手环勿扰模式是什么意思(小米手环勿扰模式怎么设置)

  • pr如何调整分辨率(pr视频的分辨率怎么调整)

    pr如何调整分辨率(pr视频的分辨率怎么调整)

  • 小米手机怎么截屏拍照(小米手机怎么截图只截一小块)

    小米手机怎么截屏拍照(小米手机怎么截图只截一小块)

  • 小爱同学无法连接网络怎么回事(小爱同学无法连接网络)

    小爱同学无法连接网络怎么回事(小爱同学无法连接网络)

  • 淘宝直播拉黑多久恢复(淘宝直播间被拉黑后进去是什么样子的)

    淘宝直播拉黑多久恢复(淘宝直播间被拉黑后进去是什么样子的)

  • 华为荣耀手环3有nfc功能吗(华为荣耀手环3怎么连接手机蓝牙)

    华为荣耀手环3有nfc功能吗(华为荣耀手环3怎么连接手机蓝牙)

  • 如何清除手机使用痕迹(如何清除手机使用密码)

    如何清除手机使用痕迹(如何清除手机使用密码)

  • tim邮箱在哪里(tim邮箱在哪里打开)

    tim邮箱在哪里(tim邮箱在哪里打开)

  • 飞猪旅行如何投诉(飞猪旅行怎么联系客服)

    飞猪旅行如何投诉(飞猪旅行怎么联系客服)

  • 个人所得税账务处理分录
  • 手机个人所得税app下载官网
  • 纳税申报的基本内容有哪些
  • 交通费中的高速费怎么算
  • 行政单位利息收入可以扣除手续费
  • 税控系统技术维护费会计处理280
  • 年金终值系数公式例题
  • 减免增值税款怎么算
  • 商业承兑汇票贴现率
  • 非限定性净资产借贷方向
  • 利润表管理费用怎么算
  • 行政事业性收费票据
  • 出口业务退税流程资料
  • 小规模国税怎么报税
  • 开票显示错误信息是怎么回事
  • 增值税专用发票怎么开
  • 企业销售赠券的增值税如何处理
  • 员工异地缴纳社保协议
  • 以股东投资为基础
  • 银行贷款损失的认定标准
  • 营改增后房地产公司税种及税率
  • 前年的票发现要不得,可以冲红吗
  • 给员工购消费卡怎么做账
  • 建筑业简易计税分包差额申报
  • 沙特将开征增值税和特殊商品消费税
  • 小规模纳税人专票开3%的专票,以后就不能享受1%
  • 以前的纳税申报表还能打印吗
  • 更正或作废申报怎么填
  • ubuntu系统u盘安装
  • Linux中RedHat CentOS Ubuntu Fedora的区别详解
  • 驾校收入与成本的关系
  • 个人投资额是什么意思
  • 跨年销货退回账务处理
  • 以专利权出资,能否使用专利权
  • 重装win7系统鼠标键盘没反应
  • php字符
  • linux递归创建目录命令
  • 美国大峡谷在哪儿
  • 职工福利费入账依据
  • 智能驾驶adas概念股龙头
  • lsscsi命令详解
  • mysql 触发器
  • 装卸搬运的设备有哪些
  • 生产性资金性质
  • 其他应付款辅助是供应商还是客户
  • 没进项发票的开销项发票多少税?
  • 收到的加盟费要交税吗
  • 所得税汇算清缴调整后要账务处理吗
  • 计提坏账准备的金额怎么算的
  • 员工购买口罩会计科目
  • 接受捐赠的材料计入什么科目
  • 财务报表年报里面的利息费用怎么填
  • 收到上个月退税会计分录
  • 分公司分摊比例
  • 出售其他权益工具投资其他综合收益
  • 同一控制下的控股合并中,投资方
  • 哪些凭证是有效凭证
  • 公户转私户的钱怎么退回来
  • 过期食品返厂会重新打日期吗
  • 外经证是干什么用的
  • 哪些业务需要计提国别风险准备金
  • 凭证填制的标准要求
  • 明细分类账的格式与登记方法
  • sqlserver1053怎么解决
  • SQL Server Table中XML列的操作代码
  • Vista下jusched.exe进程与禁用
  • awk中使用sed
  • 如何关闭win8.1自动更新
  • uiview继承哪个类
  • opengl纹理错误变成条纹
  • mysql如何将查询结果输出到文件
  • js实现的简洁二次函数
  • 黑洞数6174视频
  • 上海电子税务局怎么添加办税员
  • 对税务总局党组织的评价
  • 南京税务局 局长
  • 广东省广州市国家安全局
  • 世界近代史的改革有哪些
  • 企业税收筹划的基本目标
  • 苏宁易购股份转增股本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号