构建浏览器外壳
一个简短的工作教程:将CefBrowser控件变成一个可工作的浏览器,带有地址栏、后退/前进/刷新按钮、缩放以及一些辅助工具(DevTools、PDF导出)。
完整项目以示例1b——Chromium Embedded Framework示例的形式在新项目对话框中提供(窗体示例1)。本教程描述其关键部分。
窗体
将一个CefBrowser控件放置到窗体上并重命名为 WebView。在其周围添加一个名为 AddressBar 的 TextBox 以及六个 CommandButton——btnBack、btnForward、btnRefresh、btnZoomIn、btnZoomOut、btnPDF、btnDevTools。
导航
最基本的导航方法——Navigate、GoBack、GoForward、Reload——都是单行代码:
Private Sub btnBack_Click() Handles btnBack.Click
WebView.GoBack()
End Sub
Private Sub btnForward_Click() Handles btnForward.Click
WebView.GoForward()
End Sub
Private Sub btnRefresh_Click() Handles btnRefresh.Click
WebView.Reload()
End Sub要使后退/前进按钮跟随实际的浏览历史状态,在每次导航后根据CanGoBack和CanGoForward同步它们:
Private Sub WebView_NavigationComplete( _
ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long) _
Handles WebView.NavigationComplete
btnBack.Enabled = WebView.CanGoBack
btnForward.Enabled = WebView.CanGoForward
End SubINFO
IsSuccess和WebErrorStatus是事件签名的一部分,但目前返回占位值(True和0)——使用DocumentURL确认浏览器实际到达的位置。
地址栏
在地址栏中按Enter触发导航。反向——保持可见URL与页面同步——是SourceChanged事件,每当DocumentURL更改时触发(包括同文档的 history.pushState 更新):
Private Sub AddressBar_KeyDown(KeyCode As Integer, Shift As Integer) _
Handles AddressBar.KeyDown
If KeyCode = vbKeyReturn Then WebView.Navigate AddressBar.Text
End Sub
Private Sub WebView_SourceChanged(ByVal IsNewDocument As Boolean) _
Handles WebView.SourceChanged
AddressBar.Text = WebView.DocumentURL
End SubNavigate需要带方案的完整URI——http://、https://、file://、……与WebView2不同,方案缺失时不会自动添加 https:// 前缀。
缩放
ZoomFactor是一个Double——1.0为100%,1.5为150%。在浏览器达到Ready之前,该值读取为 0,因此乘以当前值的算术运算会悄悄从零开始,除非你先钳制:
Private Sub btnZoomIn_Click() Handles btnZoomIn.Click
If WebView.ZoomFactor = 0 Then WebView.ZoomFactor = 1
On Error Resume Next
WebView.ZoomFactor *= 1.1
End Sub
Private Sub btnZoomOut_Click() Handles btnZoomOut.Click
If WebView.ZoomFactor = 0 Then WebView.ZoomFactor = 1
On Error Resume Next
WebView.ZoomFactor /= 1.1
End SubOn Error Resume Next 捕获在Ready触发前点击按钮时引发的"控件未就绪"错误。
PDF导出
PrintToPdf异步将当前文档保存到磁盘——结果以PrintToPdfCompleted或PrintToPdfFailed事件到达:
Private Sub btnPDF_Click() Handles btnPDF.Click
Dim outputPath As String = _
Environ$("USERPROFILE") & "\Documents\page.pdf"
WebView.PrintToPdf(outputPath)
End Sub
Private Sub WebView_PrintToPdfCompleted() Handles WebView.PrintToPdfCompleted
MsgBox "PDF saved.", vbInformation
End SuboutputPath后面的可选参数——cefPrintOrientation、以微米为单位的页面大小、边距、页眉/页脚切换——允许宿主覆盖Chromium的默认值。完整签名参见PrintToPdf参考。
DevTools
Chromium DevTools窗口在其自己的顶层窗口中打开:
Private Sub btnDevTools_Click() Handles btnDevTools.Click
WebView.OpenDevToolsWindow()
End SubCEF包目前未暴露WebView2的OpenTaskManagerWindow等效功能——参见参考的WebView2对等部分了解当前差距列表。
窗体标题同步
要使宿主窗口的标题跟踪页面的 <title>,监听DocumentTitleChanged并读取DocumentTitle:
Private Sub WebView_DocumentTitleChanged() Handles WebView.DocumentTitleChanged
Me.Caption = WebView.DocumentTitle
End Sub下一步
- 托管本地Web资源 —— 无需HTTP服务器即可从文件夹提供HTML/JS/CSS。
- JavaScript互操作 —— 在BASIC和页面之间传递值和方法调用。
- 重入性 —— 使用JsRun前需要了解的一件事。
- CefBrowser参考 —— 每个属性、方法和事件。