Skip to content

构建浏览器外壳

一个简短的工作教程:将CefBrowser控件变成一个可工作的浏览器,带有地址栏、后退/前进/刷新按钮、缩放以及一些辅助工具(DevTools、PDF导出)。

完整项目以示例1b——Chromium Embedded Framework示例的形式在新项目对话框中提供(窗体示例1)。本教程描述其关键部分。

窗体

将一个CefBrowser控件放置到窗体上并重命名为 WebView。在其周围添加一个名为 AddressBarTextBox 以及六个 CommandButton——btnBackbtnForwardbtnRefreshbtnZoomInbtnZoomOutbtnPDFbtnDevTools

导航

最基本的导航方法——NavigateGoBackGoForwardReload——都是单行代码:

vb
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

要使后退/前进按钮跟随实际的浏览历史状态,在每次导航后根据CanGoBackCanGoForward同步它们:

vb
Private Sub WebView_NavigationComplete( _
        ByVal IsSuccess As Boolean, ByVal WebErrorStatus As Long) _
        Handles WebView.NavigationComplete
    btnBack.Enabled = WebView.CanGoBack
    btnForward.Enabled = WebView.CanGoForward
End Sub

INFO

IsSuccessWebErrorStatus是事件签名的一部分,但目前返回占位值(True0)——使用DocumentURL确认浏览器实际到达的位置。

地址栏

在地址栏中按Enter触发导航。反向——保持可见URL与页面同步——是SourceChanged事件,每当DocumentURL更改时触发(包括同文档的 history.pushState 更新):

vb
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 Sub

Navigate需要带方案的完整URI——http://https://file://、……与WebView2不同,方案缺失时不会自动添加 https:// 前缀。

缩放

ZoomFactor是一个Double——1.0为100%,1.5为150%。在浏览器达到Ready之前,该值读取为 0,因此乘以当前值的算术运算会悄悄从零开始,除非你先钳制:

vb
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 Sub

On Error Resume Next 捕获在Ready触发前点击按钮时引发的"控件未就绪"错误。

PDF导出

PrintToPdf异步将当前文档保存到磁盘——结果以PrintToPdfCompletedPrintToPdfFailed事件到达:

vb
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 Sub

outputPath后面的可选参数——cefPrintOrientation、以微米为单位的页面大小、边距、页眉/页脚切换——允许宿主覆盖Chromium的默认值。完整签名参见PrintToPdf参考

DevTools

Chromium DevTools窗口在其自己的顶层窗口中打开:

vb
Private Sub btnDevTools_Click() Handles btnDevTools.Click
    WebView.OpenDevToolsWindow()
End Sub

CEF包目前未暴露WebView2OpenTaskManagerWindow等效功能——参见参考的WebView2对等部分了解当前差距列表。

窗体标题同步

要使宿主窗口的标题跟踪页面的 <title>,监听DocumentTitleChanged并读取DocumentTitle

vb
Private Sub WebView_DocumentTitleChanged() Handles WebView.DocumentTitleChanged
    Me.Caption = WebView.DocumentTitle
End Sub

下一步

twinBASIC及其LOGO版权为作者"韦恩"所有