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

Go wv(WebView2) GUI框架介绍和使用

说明

wv(webview2) 是Go语言基于LCL和WebView2基础上封装的框架,用于开发Windows GUI软件。

介绍

LCL(Lazarus Component Library) :跨平台原生UI组件库.

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

WebView2使用 [WebView4Delphi] 得益于封装(https://github.com/salvadordf/WebView4Delphi) ,并做为LCL中的一个控件使用.

限制

  • 仅支持 Windows
  • Windows 7 需要安装 WebView2 运行时环境
  • Windows 10, 11 不需要安装运行时环境.

依赖

  • Golang >= 1.20
  • Webview2 运行时环境, Windows10/11一搬不需要安装
  • liblcl.dll LCL控件库动态链接库, 绑定库.

环境准备

创建目录并初始化Golang为工作空间

  • mkdir demoworkspace
  • cd demoworkspace
  • go work init

获取&克隆 lcl 和 wv 仓库

  • https://gitee.com/energye/lcl
  • https://gitee.com/energye/wv
  • 将lcl和wv添加到工作空间
go work use lcl
go work use wv

获取 WebView2 和 liblcl.dll

说明

  • 创建任意目录并设置到 ENERGY_HOME 环境变量, 并将两个动态链接库放置到该环境变量目录
  • 或把两个动态链接库放置到Go编译的二进制.exe同一目录

环境总结

  1. 将lcl和wv仓库克隆到本地的Golang工作空间目录
  2. 下载依赖的动态链接库 WebView2 和 liblcl.dll
  3. Golang >= 1.20

创建自己应用

在工作空间目录 demoworkspace 创建自己的Go项目做为GUI应用, 并添加到工作空间

mkdir demo
cd demo
go mod init demo
cd ../
go work use demo
示例代码
package main

import (
	"fmt"
	"github.com/energye/lcl/api/libname"
	"github.com/energye/lcl/lcl"
	"github.com/energye/lcl/tools/exec"
	"github.com/energye/lcl/types"
	"github.com/energye/wv/wv"
	"path/filepath"
)

var (
	mainForm TMainForm    // 主窗口
	load     wv.IWVLoader // webview2 loader
)

func main() {
	wv.Init(nil, nil)
	load = wv.GlobalWebView2Loader()
	liblcl := libname.LibName
	webView2Loader, _ := filepath.Split(liblcl)
	webView2Loader = filepath.Join(webView2Loader, "WebView2Loader.dll")
	load.SetUserDataFolder(filepath.Join(exec.CurrentDir, "EnergyCache"))
	load.SetLoaderDllPath(webView2Loader)
	if load.StartWebView2() {
		// 底层库全局异常
		lcl.Application.SetOnException(func(sender lcl.IObject, e lcl.IException) {
			fmt.Println("全局-底层库异常:", e.ToString())
		})
		lcl.Application.Initialize()
		lcl.Application.SetMainFormOnTaskBar(true)
		lcl.Application.CreateForm(&mainForm)
		lcl.Application.Run()
	}
}

type TMainForm struct {
	lcl.TForm
	windowParent wv.IWVWindowParent
	browser      wv.IWVBrowser
}

func (m *TMainForm) FormCreate(sender lcl.IObject) {
	m.SetCaption("Go wv(Webview2) - demo") // 窗口标题
	m.SetBounds(0, 0, 800, 600)            // 窗口大小
	m.WorkAreaCenter()                     // 屏幕居中
	// webview2 window组件
	m.windowParent = wv.NewWVWindowParent(m)
	m.windowParent.SetParent(m)
	m.windowParent.SetAlign(types.AlClient)
	// webview2 browser组件
	m.browser = wv.NewWVBrowser(m)
	m.browser.SetDefaultURL("https://www.baidu.com") // 指定一个要加载的地址
	m.browser.SetOnAfterCreated(func(sender lcl.IObject) {
		// browser创建完成后刷新 window组件大小
		m.windowParent.UpdateSize()
	})
	// 设置browser到window parent
	m.windowParent.SetBrowser(m.browser)
	// 窗口显示事件, 创建browser
	m.SetOnShow(func(sender lcl.IObject) {
		if load.InitializationError() {
		} else {
			if load.Initialized() {
				m.browser.CreateBrowser(m.windowParent.Handle(), true)
			}
		}
	})
}
Go WebView2效果

在这里插入图片描述

Go WebView2 架构

在这里插入图片描述


http://www.kler.cn/a/287916.html

相关文章:

  • candence : 通孔焊盘、插装器件封装绘制
  • Jav项目实战II基于微信小程序的助农扶贫的设计与实现(开发文档+数据库+源码)
  • MongoDB分布式集群搭建----副本集----PSS/PSA
  • 自由学习记录(22)
  • Java垃圾回收算法
  • Javascript中的深浅拷贝以及实现方法
  • 【Python报错已解决】“NameError: name ‘re‘ is not defined”
  • BeanFactory 和 FactoryBean 的区别
  • 用QT写一个加载模板文件,替换关键字为实际值
  • 【前端框架】你知道的前端框架有哪些呢
  • JavaWeb(基于SpringBoot开发)全总结(1)
  • 藏头诗娱乐小程序源码
  • 如何在 Spring Boot 中创建自定义注解简化重复编码
  • 栈和队列
  • 一 lua学习笔记:概述
  • 第L2周:机器学习-线性回归
  • Ubuntu系统本地搭建WordPress网站并一键发布内网站点至公网实战
  • 20-22 - 打造专业的编译环境
  • Language Models are Few-Shot Learners
  • 【计算机网络复习资料】
  • hello树先生——红黑树
  • go中的并发处理
  • 书生大模型实战营(1)——InterStudio基础知识+Vscode SSH连接远程服务器+Linux基础指令
  • 深度解析MFT损坏:原因、恢复策略与预防措施
  • 知道哪些键值型存储数据结构?这些数据结构的时间、空间复杂度分别是什么?什么时候选⽤?
  • 【C++】C++ 多态的底层实现