CEF中文教程(google chrome浏览器控件) -- CEF简介

官方主页:  点击打开链接


CEF简介: 

   嵌入式Chromium框架(简称CEF) 是一个由Marshall Greenblatt在2008建立的开源项目,它主要目的是开发一个基于Google Chromium的Webbrowser控件。CEF支持一系列的编程语言和操作系统,并且能很容易地整合到新的或已有的工程中去。

  它的设计思想政治就是易用且兼顾性能。CEF基本的框架包含C/C++程序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和Chromium&Webkit的操作细节。它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户插件,协议,javascript对象以及javascript扩展,宿主程序可以随意地控件资源下载,导航,下下文内容和打印等,并且可以跟Google Chrome浏览器一起,支持高性能和Html5 技术,


CEF指南:


指南:

  首先把这段代码插入到窗口的创建函数里面去:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // Create an instance of our CefClient implementation. Various methods in the  
  2. // MyClient instance will be called to notify about and customize browser  
  3. // behavior.   
  4. CefRefPtr<CefClient> client(new MyClient());  
  5.   
  6. // Information about the parent window, client rectangle, etc.  
  7. CefWindowInfo info;  
  8. info.SetAsChild(...);  
  9.   
  10. // Browser initialization settings.  
  11. CefBrowserSettings settings;  
  12.   
  13. // Create the new browser window object asynchronously. This eventually results  
  14. // in a call to CefLifeSpanHandler::OnAfterCreated().  
  15. CefBrowser::CreateBrowser(info, client, "http://www.google.com", settings);  

这段代码你可以在[test]文件夹下面的cefclient工程里面看到。

文件结构:

  include -- 这个文件夹里面放CEF客户应用程序所需的头文件

  libcef -- 此文件夹存放CEF的静态库

  libcef_dll -- 此文件夹CEF的动态拉链库

  tests -- 此文件夹存放测试的例子

       cefclient -- 一个简单的客户程序

       unittests --  CEF界面单元测试


浏览器事件:


   应用程序通过调用CefBrowser和CefFrame的方法来处理浏览器控件事件:
       a.Back, Forward, Reload and Stop Load。控件浏览器的导航
       b.Undo, Redo, Cut, Copy, Paste, Delete, Select All.控件目标框架的选取
       c.Print。打印目标框架
       d.Get Source。以字符串的形式来获取目标框架的HTML源码
       e.View Source. 用缓存文件来保存目的框架的HTML源码,并且用系统默认的文本查看器打开
       f.Load URL.加载特定的URL到目标框架
       g.Load String. 加载一个特定的字符串到目标框架,通过一个随意指定的虚拟URL
       h.Load Stream. 加载一个特定的二进制文件到目标框架,通过一个随意指定的虚拟URL
       i.Load Request, 加载一个特定的请求到目标框架
       j.Execute JavaScript: 在目标框架里面执行一个特定的Javscript命令
       k. Zoom。 缩放特定框架的网页内容

插入网景风格插件:

      CEF支持插入网景风格的插件,插入插件的动作跟正常插入基本动态链接库的插件一样,但是做为一个单独的Dll,必须通过容器来创建,并且要用CefRegisterPlugin()这个函数来注册到系统里面去。你要调用这个函数的话,你就得包含cef_nplugin.h这个头文件。

JavaScript扩展:

    CEF支持能连接本地程序源代码的Javascript扩展,演示程序你可以去看cef_v8.h进而的CefRegisterExtension()方法,还有CEFClient下面的演示例子,你如果想得到更多的信息,可以点下面的链接:   JavaScriptIntegration

用户计划:

    CEF支持注册和处理像myscheme://mydomain一样的用户计划,你可去查看cef_scheme.h里面的CefRegisterScheme()和Scheme Handler测试单元,得到详细的说明。


框架总览:

   所有的文件前缀都是Cef


框架的建立和销毁:

   CEF的UI消息寄宿在一个框架建立的单线程中,用户只负责用 CefInitialize()和CefShutdown()来建立和销毁这个线程,但是你如果设置了CefSettings.multi_threaded_message_loop, 这个UI消息循环也可以运行在一个单独的线程里面。


引用计数:

   所有的框架数都从CefBase这个基类继承而来,并且所有的实例指针都用CefRefPtr智能指针来管理,可以用AddRef()和Release()函数来自动处理引用计数。

平台无关:

   CEF框架被设计成平台无关的,现在它支持Windows,Mac os-x和Linux,为了无缝地支持多种平台,框架定义了一系列的平台无关的接口和类型定义。


框架接口:

      CefBrowser是主要的浏览器窗口类,可以用静态的函数CreateBrowser() 和CreateBrowserSync() 来创建一个新的浏览器窗口。
      CefFrame 代表一个浏览器窗口的框架,每个浏览器窗口有一个顶层的主框架,而这个主框架可以用GetMainFrame() 方法得到。
      CefClient是主浏览器窗口的代表接口,这个接口做为参数传递给CreateBrowser()
      CefRequest 代表URL,方法,发送数据和头文件等这样的请求。
      CefSchemeHandleFactory 类是被用来处理像myscheme://mydomain类似客户计划的请求
      CefReadHandler和CefWriteHandle是一个读写数据的简单接口。
      CefV8Handler,CefV8Value和CefV8Context是被用来创建和访问JavaScript对象。

以上内容是Cef的简介,后面我将翻译怎么编译并生成一个用CEF控件来创建的一个简单浏览器!



    这部分讲解CEF的分支信息并介绍下载编译和打包源代码

背景:

      CEF项目是做为Chromium的扩展项目而存在的,CEF跟Chromium一样地维护两个版本,开发版和发布版。CEF源代码既可以手动编译,也可以用工具自动编译

发展:

     CEF项目在不断的发展中,你可以从这里看到整个项目的文件 trunk,因为当前的版本紧跟Chromium,所以不推荐拿当前的版本来开发发布版的产品。下面的链接可以用来下载CEF的开发版源码:
     remind:你点开上面的链接时,你会发现这是一个svn工程的目录,如果以前是用VSS的,你可能觉得svn很陌生,不要尝试一个一个地去下载里面的文件。这里有个简单的方法可以下载整个文件夹:先下载一个TortoiseSVN,下完后安装,但是你不会看到有什么的TortoiseSVN的运行程序,因为它是内嵌到Windows里面的,你应该在任意的盘符下面创建一个空的文件夹,右键点击这个文件夹,点击菜单项【TortoiseSVN】->【export】,在URL文件框里面输入上面的链接后点确定,然后现在个工程文件都会下下来。

发布版:

     CEF随着Chromium发布版也提供一个最新的发布版,推荐用户用发布版本做为开发产品的环境,原因有如下几点:
     1.二进制的CEF是用特定的Chromium发布版编译出来的
      2.发布版的CEF/Chromium经过了更好的测试,而且更加适合开发发布版的应用程序
      3.发布版更加稳定
      4.CEF发布版可以包含必要的Chromium/WebKit版本
      5.CEF以后的更新不会干扰用户的发布计划

CEF版本号有如下形式:X.Y.Z,其中X是CEF主版本号,Y是发布版版本号,而Z是CEF校对号,有关CEF和Chromium版本更详细的内容,你可以去include/cef_version.h里面找到,下面的表格列出当前的CEF发布版本:
      
发布版本Chromium版本CEF1支持性CEF3支持性
96317
1025 18
108419
118021
127123
136425
145326

你可以在下面的链接中下载发布版的CEF, 其中YYYY是发布版的版本号:

这里值得注意的是版本963和1025是只包含有CEF1的源代码,要想了解CEF发布版的版本号怎么来的,你可以点击旁边这个链接:  here

编译源代码:

    当前支持在Windows,Mac OS-X和Linux环境下编译源代码,而要想编译成功,你的电脑必须至少有4GB的系统内存(因为我用的Windows,所以在Mac或Linux环境下的要求我就没有翻译了)。
    在编译Chromium和CEF源码之前,你必须配置好你的编译环境:
1.为你的操作系统和开发环境安装必要的包:
    Windows环境下点击右边的链接:  http://www.chromium.org/developers/how-tos/build-instructions-windows(这个我将在下一章中给出译文)
    配置好操作系统和编译环境以后,还要用旁边的链接去下载TortoiseSVN工具:  http://sourceforge.net/projects/tortoisesvn/files/1.6.16/Application/
2.配置环境可以影响GYP
   CEF目前还不支持组件开发
   Windows - 如果你的操作系统里面安装了多个Virual Studio,你可以设置环境变量GYP_MSVS_VERSION为一个适当的值,如果你想用VS2008来编译工作,你应该把这个值设成2008,如果你想用Vs2010 Express来编译工程,那你就应该把这个环境变量设成2010e, 如果是别的Visual Studio版本,那你就要去Chomium帮助文档去查找更详细的信息,但是估计也应该是同一个套路,假如你是vs2005,那肯定就是设成2005了。

自动的方法:

   CEF提供工具,用来自动下载、编译、打包Chromium和CEF源代码,这个方法对开发版和发布版是同样有用,你可以按下面的步骤来完成自动操作:

1.下载自动工具 automate.py:
   用SVN checkout下面的URL: 
http://chromiumembedded.googlecode.com/svn/trunk/cef1/tools/automate /path/to/automate
2.运行automate.py脚本:
   在任何合适的时间,你可以运行automate.py这个脚本(如每周每天每次CEF提交的时间),并使用你想要的CEF版本。
python /path/to/automate/automate.py --download-dir=/path/to/download --url=http://chromiumembedded.googlecode.com/svn/branches/1084/cef1

    如果这个操作成功了,一个二进制形式的包会被创建在   /path/to/download/chromium/src/cef/binary_distrib
如果你要想查找完整的使用介绍,点下面的链接:  automate.README.txt 
   这个方法也被完美地整合到了一些自动编译系统如 TeamCity
(译完这段我感到浑身冷汗,因为什么TeamCity、TortioseSVN...全都一无所知,想想从业也三四年了,却离it这条路越走越远,在上个公司呆的两年多完全是封闭的两年多,天天整些CAD,用写好的API,做些重复的工作,什么新的技术都没学到,反而把老本都蚀完了,现在是时候奋起直追了。但转念一想,我还能再追几年,以我的年纪我还能追几年? 学什么走哪块,才能让我虽不说蒸蒸日上但却能有口盒饭吃呢?)

手动下载:


    Chromium和CEF可以手动下载和编译,但这更加复杂,所以不向所有用户推荐。
开发版:
    下面这些下载的介绍仅适合CEF1&CEF3开发版。
     1.安装depot_tools并且下载Chromium源代码,你可以按照这个链接的内容来做http://dev.chromium.org/developers/how-tos/get-the-code,也可以按照下面的四个步骤来做,但是为了避免一些潜在的问题,你最好设置chromium和depot_tools的下载目录尽可能的短,并且不要包含空格和特殊字符。
     A.  装一个1.6.x版本的SVN端,并且加到你的PATH里面去
     B. 通过SVN来下载depot_tools
  svn co http://src.chromium.org/svn/trunk/tools/depot_tools
     C. 增加 depot_tools的目录到你的PATH,在Windows下depot_tools的路径应该要放在TortoiseSVN的前面
    D. 创建一个Chromium签出目录(例如,/path/to/chromium),并且配置gclient如下:
cd /path/to/chromium
gclient config http://src.chromium.org/chrome/trunk/src
     remind:  上面这段你只要复制到cmd里面去运行就可以了

    2. 在CEF的顶层目录下查看 CHROMIUM_BUILD_COMPATIBILITY.txt,并找到你需要的Chromium版本,这可能会发生改变,因为CEF是随着最新版本的Chromium改变而改变的
   3. 更新Chromium到合适的版本
cd /path/to/chromium
gclient sync --revision src@chromium_revision --jobs 8 --force
   4. 下载CEF源代码到"cef"文件夹,而且这个文件夹必须包含在Chromium的"src"文件夹目录下,你最好只下载CEF1或CEF3而不要两者都下,假设你的Chromium源代码下载在 "/path/to/chromium/src",那么你的CEF源代码就应该放在"/path/to/chromium/src/cef"。注意不管你下的是CEF1或CEF3,文件夹名都必须命名为"cef"
cd /path/to/chromium/src
svn co http://chromiumembedded.googlecode.com/svn/trunk/cef1 cef

发布版:
     发布版和开发版基本的操作是一样的,只不过是把有Debug的地方改成Release而已。具体的你可以查看原文链接。

手动编译:

    1.运行cef_create_project脚本(windows下用.bat, OS-X和linux下用.sh)去产生一个在GYP配置下的编译文件
cd /path/to/chromium/src/cef
./cef_create_projects.sh
    2.编译CEF
    windows下你可以直接用Visual Studio 的.sln文件编译,做为替代的方法,你也可以在命令行下运行脚本build_projects来编译整个工程,
cd /path/to/chromium/src/cef/tools
build_projects.sh Debug

手动打包:

     当编译好开发版和发布版后,你可以用make_distrib工具(windows用.bat,OS-X和Linux用.sh)去创建一个二进制分发包。
cd /path/to/chromium/src/cef/tools
make_distrib.sh
     如果这个过程成功了,一个二进制的分发包会生成在 /path/to/chromium/src/cef/binary_distrib目录中。
     你可以去make_distrib.py脚本下看到更多的使用信息。

一般用法

使用CEF便捷的创建一个全功能的内建浏览器如下所示:

// Define an instance of our CefHandler implementation. Various methods in the MyHandler // instance will be called to customize browser behavior.  CefRefPtr<CefHandler> handler(new MyHandler()); // Provide information about the parent window, client rectangle, etc. CefWindowInfo info = {...}; // Create the new browser window object, which eventually results in a call to // MyHandler::HandleAfterCreated(). CefBrowser::CreateBrowser(info, false, handler, L"http://www.google.com");

在tests目录下有一个客户端程序的示例,叫cefclient。

文件结构

CEF资料库结构如下:

  • include -- 包括用于CEF客户端程序的include文件。
  • libcef -- libcef实现。
  • libcef_dll -- libcef C API 和 DLL 实现.
  • tests -- 测试程序.
    • cefclient -- CEF客户端应用程序示例。
    • unittests -- CEF接口单元测试。

浏览器通知

浏览器通知是通过注册的委托接口由浏览器发到客户端程序的通知, CefHandler是最主要的委托接口, CefJSHandler则用于实现自定义的Javascript对象。

CefHandler支持以下接口:

  • 窗口创建之前 (HandleBeforeCreated),客户端可用之取消与定制浏览器窗口创建过程。
  • 窗口创建之后(HandleAfterCreated). 可用于创建自定义的CefJSHandler对象。
  • 地址栏更新(HandleAddressChange). 将地址栏更改为指定的字符串,通知发生于导航提交后与页面加载前。
  • 标题更新(HandleTitleChange). 将标题更改为指定的字符串,发生在页面加载中。
  • 浏览前(HandleBeforeBrowse). 可用于取消导航,该事件的信息包括URL,Post数据,请求头.
  • 开始加载(HandleLoadStart). 
  • 加载结束 (HandleLoadEnd). 
  • 加载错误(HandleLoadError). 加载过程中遇到错误,应用程序可提供自定义的错误页面.
  • 资源加载前 (HandleBeforeResourceLoad). 应用程序可提供替代的数据源 (比如内存中的缓存)或者取消加载.
  • 显示菜单前(HandleBeforeMenu). 可用于取消上下文菜单显示或定制菜单,默认情况下,浏览器根据上下文显示基本的菜单.
  • 获取菜单标签(HandleGetMenuLabel).在默认菜单显示前,每个菜单项调用一次,可用于将英文默认内容改为其它语言.
  • 菜单动作(HandleMenuAction). 用户从默认上下文菜单选择了一个选项,可用自己的方式来处理动作。
  • 打印选项(HandlePrintOptions). 打印设置对话框显示前调用,可用于定制页面大小、方向与边距等.
  • 打印页眉页脚 (HandlePrintHeaderFooter). 在页面视图输出到打印上下文,但是页面结束前,可在预定义的6个位置(上左、上中、上右、下左,下中,下右)插入自定义的页眉、页脚字符串。该事件附带的信息包括当前URL、标题、页码、总页数、打印上下文、页边距与DPI拉伸比.
  • JavaScript警告 (HandleJSAlert). 应用程序可自定义Javascript Alert窗口.
  • JavaScrip确认 (HandleJSConfirm). 应用程序可自定义Javascript Comfirm窗口
  • JavaScrip提示 (HandleJSPrompt). 应用程序可自定义Javascript Prompt窗口
  • JavaScript Window 对象绑定 (HandleJSBinding). 应用程序将用户定义的方法和变量附加到frame的window对象上
  • Window关闭前 (HandleBeforeWindowClose). 窗口关闭前
  • 获得焦点(HandleTakeFocus). 浏览器组件失去焦点前调用
  • 设置焦点(HandleSetFocus). 浏览器组件请求焦点前调用
  • 键盘事件(HandleKeyEvent). 浏览器组件接收到键盘事件时
  • 提示 (HandleTooltip). 用于修改tooltip文字
  • 控制台消息 (HandleConsoleMessage). 用于显示控制台消息.
  • 查询结果(HandleFindResult).用于自定义查找结果显示处理

CefV8Handler支持以下通知:

  • 执行事件(Execute). 应用程序执行指定的函数,该事件提供所有的Javascript参数,而且应用程序能指定返回值

浏览器事件

浏览器事件由客户端应用程序通过CefBrowser和CefFrame的函数发送给浏览器:

  • 后退、前进、重新加载与停止加载,用于控制浏览器导航.
  • 撤消、重做、剪切、复制、粘贴、删除、全选,用于控制目标区域内容.
  • 打印. 打印目标框架.
  • 查看源代码. 将目标框架的HTML源代码保存到临时文件,并用默认的文本查看程序打开之
  • 加载URL. 在指定框架中加载指定URL
  • 载入字符串. 根据一个假URL在指定框架中加载某个字符串
  • 加载流. 根据一个假URL,在指定框架中加载二进制数据
  • 加载请求. 在指定框架中加载请求(URL, method, request data 与 headers) .
  • 执行脚本. 在目标框架中执行任意Javascript命令

内嵌 NPAPI 插件

CEF支持创建Netscape-style内嵌插件,使用相同 NPAPI的内嵌插件和标准的DLL插件行为相同,但是,相对于使用独立的DLL,内嵌插件由容器应用程序创建,并通过调用CefRegisterPlugin()注册到系统,如果要直接使用这一功能,需要include cef_nplugin.h .

JavaScript扩展

CEF支持可以和原生应用程序代码交互的Javascript扩展,参见cef.h的CefRegisterExtension() 函数和cefclient示例程序的"JavaScript Extension Handler" 以及 "UI App Example" 测试 .

自定义Schemes

CEF支持注册与处理自定义scheme,类似于myscheme://mydomain。参见cef.h中的CefRegisterScheme()函数与示例应用程序cefclient中的 "Scheme Handler" 测试.

框架实现概览

CEF所有的类以Cef为前缀.

框架准备与拆卸

UI消息循环由框架创建的一个单独线程处理,客户端程序应负责通过分别调用CefInitialize()和CefShutdown() 来为每个进程准备与关闭这一线程。

引用计数

所有实现了CefBase接口的框架类与对象指针都由CefRefPtr智能指针实现来处理,通过调用AddRef()和Release()自动处理引用计数。

平台无关

CEF框架被设计成平台无关,需要当前我们仅支持windows平台,但是我们计划将来支持其它平台。为了尽可能减少双平台支持带来的麻烦,框架定义了一系列实现无关的接口与类型定义包装跨平台的行为。

线程安全

框架的所有接口实现必须是跨线程访问安全的,CefThreadSafeBase 模版提供原子的AddRef() 和 Release() 实现,还提供Lock() 和 Unlock()方法以同步方式访问代码块.

框架接口

框架定义了如下接口:

  • CefBrowser 是主要的浏览器host类,通过它的静态方法CefBrowser::CreateBrowser()方法创建新浏览器窗口.
  • CefFrame 表示浏览器窗口里的一个框架(frame),每个浏览器窗口都有一个顶级的主框架,可通过CefBrowser::GetMainFrame()方法访问之.
  • CefHandler 是传给CefBrowser::CreateBrowser()方法的最主要委托接口.
  • CefRequest 表示请求数据,比如url, method, post data 和 headers.
  • CefPostData 和 CefPostDataElement 表示可能是请求一部分的post数据.
  • CefSchemeHandlerFactory 和 CefSchemeHandler 用于处理像myscheme://mydomain这样的自定义scheme.
  • CefStreamReaderCefStreamWriterCefReadHandler 和 CefWriteHandler 读写数据的简单的接口.
  • CefV8Handler 和 CefV8Value 用于创建和访问Javascript对象.
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CefSharp v51 x86 (用于32位应用程序) 是一个可在32位系统上使用的开源Chromium Web浏览器件。CefSharp是使用C#开发的,它允许开发人员将现代Web浏览器功能嵌入到他们的应用程序中。 要下载CefSharp v51 x86 (for 32-bit apps),您可以在CefSharp的官方网站或GitHub存储库上找到合适的版本。您可以通过以下步骤进行下载: 1. 打开您的Web浏览器,访问CefSharp官方网站或搜索CefSharp GitHub存储库。 2. 在官网或存储库页面上,找到CefSharp v51 x86 (for 32-bit apps)的下载链接或选项。 3. 单击下载链接或选项,选择存储下载文件的位置。 4. 下载完成后,您将得到一个压缩文件(通常是ZIP或RAR格式)。解压缩该文件以获取其中的内容。 5. 在解压缩后的文件夹中,您将找到一个或多个CefSharp v51 x86 (for 32-bit apps)的库文件和示例或文档。 6. 根据您的需求,可以将库文件复制到您的应用程序项目中,并参考示例或文档以了解如何使用CefSharp v51 x86件在32位应用程序中嵌入Web浏览器功能。 请确保选择适用于您的操作系统和应用程序架构的正确版本(32位或64位),以确保CefSharp v51 x86正常运行。 希望这个回答对您有帮助,并且能让您成功下载和使用CefSharp v51 x86 (for 32-bit apps)。如果您还有其他问题,请随时提问。 ### 回答2: cefsharp v51 x86是针对32位应用程序的一个版本,可以用于下载。 要下载cefsharp v51 x86,你可以按照以下步骤进行操作: 1. 打开你的浏览器并访问cefsharp的官方网站(https://cefsharp.github.io/)。 2. 导航到该网站的下载页面,通常位于主菜单或类似位置的"Downloads"部分。 3. 在下载页面上,你可能会看到目前可用的不同版本和架构的cefsharp。 4. 找到并选择cefsharp v51 x86(32位应用程序)的下载选项。 5. 点击下载链接或按钮,并等待文件下载完成。 6. 下载完成后,你可以找到下载的文件,通常保存在你的浏览器默认下载文件夹中。 7. 解压下载的文件(如果它是压缩文件),你将得到可执行文件或其他相关文件。 8. 根据你的应用程序的需要,将cefsharp v51 x86集成到你的项目中,并使用它来开发你的应用程序。 注意:请确保你下载的文件来源可信,以避免下载到恶意软件或损害你计算机的文件。在下载之前,最好检查官方网站和文件的完整性以确保安全性。 ### 回答3: cefsharp v51 x86是一个供32位应用程序使用的CEFSharp软件版本。 CEFSharp是一个基于Chromium Embedded Framework(CEF)的.NET封装库,旨在支持在Windows操作系统上开发基于Chromium浏览器的应用程序。 要下载CEFSharp v51 x86版本,您可以按照以下步骤进行操作: 1. 首先,打开您的Web浏览器(如Google Chrome、Mozilla Firefox等)。 2. 输入“CEFSharp v51 x86下载”或类似的关键字进行搜索。 3. 在搜索结果中,找到可信和官方来源的网站,可能是CEFSharp的官方网站或GitHub页面。 4. 导航到找到的网站,并找到与32位应用程序相关的下载区域或部分。 5. 从列表中找到并选择“CEFSharp v51 x86”版本。 6. 在下载选项旁边,可能有指定操作系统和文件类型的选项。确保选择与您的操作系统和应用程序要求匹配的选项。 7. 单击下载按钮开始下载。 请注意,下载速度可能取决于您的网络连接速度和选定的下载源的稳定性。确保选择安全、可靠的下载源,以防止下载到恶意软件或病毒。 完成下载后,您可以将CEFSharp v51 x86安装到您的应用程序项目中,并根据其相关文档和示例进行配置和使用。这样,您的32位应用程序就可以使用CEFSharp v51 x86版本来集成基于Chromium的浏览器功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值