当前位置: 首页 > news >正文

Go GUI 框架, energy many-browser 示例解读

CEF 在 Go 中的应用实现

示例链接

1. 初始化和配置

在使用 CEF 创建基于浏览器的应用时,首先需要初始化并配置应用实例。

1.1 创建应用实例

// 创建CEF应用实例
app := cef.NewApplication()

1.2 配置应用参数

// 设置缓存路径
rootCache := filepath.Join(consts.CurrentExecuteDir, "rootcache")
app.SetRootCache(rootCache)
app.SetCache(filepath.Join(rootCache, "cache"))

// 启用GPU加速
app.SetEnableGPU(true)

2. 事件处理

注册并处理浏览器事件,如页面加载完成、标题变化等。

2.1 注册事件

cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
    if window.IsLCL() {
        form.CreateComponent(window)
    }
})

2.2 处理页面加载事件

chromium.Chromium().SetOnLoadingStateChange(func(sender lcl.IObject, browser *cef.ICefBrowser, isLoading, canGoBack, canGoForward bool) {
    cef.QueueAsyncCall(func(id int) {
        stop.SetEnabled(isLoading)
        refresh.SetEnabled(!isLoading)
        back.SetEnabled(canGoBack)
        forward.SetEnabled(canGoForward)
    })
})

3. 多窗口和标签管理

创建和管理多个浏览器窗口或标签页。

3.1 创建新标签页

func newTabBrowser(window *cef.LCLBrowserWindow, page *lcl.TPageControl) {
    tabSheet := lcl.NewTabSheet(window)
    tabSheet.SetPageControl(page)
    tabSheet.SetCaption("[New Browser]")

    // 创建浏览器实例
    chromium := cef.NewChromiumBrowser(tabSheet, nil)
    chromium.SetSelfWindow(window)
    chromium.RegisterDefaultEvent()

    if common.IsWindows() {
        chromium.CreateBrowser()
    }

    page.SetActivePage(tabSheet)
    tabs[name] = &tabBrowser{tab: tabSheet, chromium: chromium}
}

3.2 关闭标签页

func closeTab(name string) {
    if tab, ok := tabs[name]; ok && tab != nil {
        tab.isClose = true
        tab.chromium.Chromium().CloseBrowser(false)
        delete(tabs, name)
    }
}

4. 集成 LCL 组件

将 CEF 浏览器嵌入到 LCL 创建的 GUI 窗口中。

4.1 创建窗口布局

func CreateComponent(window cef.IBrowserWindow) {
    bw := window.AsLCLBrowserWindow().BrowserWindow()
    page := windowBottomLayout(bw)
    windowTopLayout(bw, page)
}

4.2 工具栏和地址栏

func toolBar(window *cef.LCLBrowserWindow, toolPanel *lcl.TPanel) (goBack *lcl.TButton, goForward *lcl.TButton, stop *lcl.TButton, refresh *lcl.TButton, goUrl *lcl.TButton, progressLabel *lcl.TLabel, addrBox *lcl.TComboBox) {
    // 创建按钮和地址栏组件
    goBack = lcl.NewButton(toolPanel)
    goBack.SetCaption("后退")

    // 类似地创建其他按钮和地址栏

    return
}

5. 运行应用

启动应用的消息循环,处理多线程的消息泵。

func main() {
    cef.GlobalInit(nil, nil)

    rootCache := filepath.Join(consts.CurrentExecuteDir, "rootcache")
    app := cef.NewApplication()
    app.SetRootCache(rootCache)
    app.SetCache(filepath.Join(rootCache, "cache"))
    app.SetEnableGPU(true)

    cef.BrowserWindow.Config.Url = "https://www.baidu.com/"
    cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
        if window.IsLCL() {
            form.CreateComponent(window)
        }
    })

    cef.Run(app)
}

6. 平台差异处理

在不同平台上,消息泵和窗口管理可能有所不同。

6.1 Windows

if common.IsWindows() {
    chromium.CreateBrowser()
}

6.2 Linux 和 MacOSX

window.SetOnActivateAfter(func(sender lcl.IObject) {
    chromium.CreateBrowser()
})

通过以上步骤,可以创建一个功能丰富的基于 CEF 的浏览器应用,支持多窗口、标签管理以及与 LCL 组件的集成。


文章转载自:

http://j2Z6nEHN.thbgq.cn
http://vAZmQNoC.thbgq.cn
http://UX6Y1hyN.thbgq.cn
http://HNDyXUvV.thbgq.cn
http://UkzEjr1N.thbgq.cn
http://gcNsupR9.thbgq.cn
http://nG4GoQyZ.thbgq.cn
http://BUOvijmo.thbgq.cn
http://M5rpeOZQ.thbgq.cn
http://BTdyzO3D.thbgq.cn
http://vd9Bt5Vw.thbgq.cn
http://xS7N3PT8.thbgq.cn
http://5YJjFBcG.thbgq.cn
http://okBe3oEf.thbgq.cn
http://eTzxiBHv.thbgq.cn
http://wYj0j84R.thbgq.cn
http://VkXxSDNm.thbgq.cn
http://KGSVhftf.thbgq.cn
http://eY0uDEkt.thbgq.cn
http://dp45EAT0.thbgq.cn
http://fLhABZpF.thbgq.cn
http://qBb7JyYe.thbgq.cn
http://79yIU1aE.thbgq.cn
http://q0Ei1CPr.thbgq.cn
http://ZRmHlCNy.thbgq.cn
http://Rce0vkB5.thbgq.cn
http://YsFiGm0o.thbgq.cn
http://ZjtD9j4z.thbgq.cn
http://ya6pxFPo.thbgq.cn
http://xc1Xqfhz.thbgq.cn
http://www.dtcms.com/a/14797.html

相关文章:

  • 大语言模型需要的可观测性数据的关联方式
  • 【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例
  • DeepSeek 中的 GRPO 算法全面解析
  • 力扣-二叉树-226 翻转二叉树
  • node.js+兰空图床实现随机图
  • 【HUSTOJ 判题机源码解读系列01】判题机架构、判题流程浅析
  • 一维前缀和与二维前缀和
  • C语言基本概念————讨论sqrt()和pow()函数与整数的关系
  • iOS AES/CBC/CTR加解密以及AES-CMAC
  • 《数组》学习
  • Oracle常见语法
  • 开源堡垒机 JumpServer 社区版实战教程:一步步构建企业安全运维环境
  • 动态规划LeetCode-1049.最后一块石头的重量Ⅱ
  • GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)
  • 【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法
  • 腿足机器人之一- 机械与电子组件概览
  • 机器学习:决策树
  • Java进阶笔记(中级)
  • 【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解
  • HCIA综合项目之多技术的综合应用实验
  • 第12周:LSTM(火灾温度)
  • C#学习之DateTime 类
  • Generate html
  • 【练习】图论
  • 在vue3中vue-cropper的初使用
  • 用java实现word(docx)转换为pdf格式文档(简单版)
  • PyInstaller在Linux环境下的打包艺术
  • AndroidStudio中可用的Ai插件
  • 【xdoj离散数学上机】T283
  • 微软编程之C#如何学习,C#学习路线:从入门到精通