(原) Golang之GUI: govcl

原创文章,请后转载,并注明出处。

GoVCL Go语言可视化组件库。

Github: https://github.com/ying32/govcl

官方网站:https://z-kit.cc/

文档做得不错https://gitee.com/ying32/govcl/wikis/pages

它需要下载支持库放在当前或库目录,当前V2.0.2。

跨平台支持Windows(目前只对Windows Vista之上系统比较友好,对Windows XP有些问题),Linux,macOS。arm和Linux32位系统的支持需要自己编译(库支持文件)

作者的重要提醒

生命周期: 所有对象都为手动管理,没有GC, 没有引用计数。详情参考“LCL对象生命周期”

线程/协程中访问: 所有UI组件都是非线程/协程安全的,当需要异步更新时,请使用ThreadSync来同步显示到UI上。

作者正在开发一个界面设计器,即在软件中拖动生成界面。虽然定为收费模式,值得观察。以前用微软系列的时候,界面直接拖动生成,减少大量的设计时间。

libvcl: libvcl基于Delphi 10.2.x版本制作,只能应用于Windows下,稳定性较好。

liblcl: liblcl基于Lazarus 2.0.x版本制作,可以用作跨平台,有些功能或者性能略低于libvcl。

最新下载的是liblcl。


简单看看HelloWorld

package main

import (
	"fmt"

	"github.com/ying32/govcl/vcl"
	"github.com/ying32/govcl/vcl/types"
)

type TForm1 struct {
	*vcl.TForm
	Button1 *vcl.TButton
}

var form1 *TForm1

func main() {
	vcl.Application.SetFormScaled(true) //设置全局窗口的Scaled
	vcl.Application.SetIconResId(3)
	vcl.Application.Initialize()
	vcl.Application.SetMainFormOnTaskBar(true) //主窗口显示在任务栏上

	mainForm := vcl.Application.CreateForm()   //创建窗口
	mainForm.SetCaption("哈喽")                  //设置窗口标题
	mainForm.SetPosition(types.PoScreenCenter) //窗口居中
	mainForm.EnabledMaximize(false)            //禁止最大化
	mainForm.SetWidth(600)                     //设置窗口大小
	mainForm.SetHeight(400)
	mainForm.SetOnCloseQuery(func(Sender vcl.IObject, CanClose *bool) {
		//这里发生了错误,以后再分析
		*CanClose = vcl.MessageDlg("是否退出?", types.MtConfirmation, types.MbYes, types.MbNo) == types.IdYes
	})

	vcl.Application.CreateForm(&form1, true) //用于按钮创建窗口

	btn := vcl.NewButton(mainForm) //创建按钮
	btn.SetParent(mainForm)        //按钮父控制为主窗口
	btn.SetCaption("  建立窗口1 ")     //按钮标签
	btn.SetWidth(200)
	btn.SetHeight(60)
	btn.SetLeft(50) //按钮位置
	btn.SetTop(50)
	btn.SetOnClick(func(sender vcl.IObject) { //按钮点击事件
		form1.Show()
	})

	vcl.Application.Run() //启动窗口
}

//子窗口创建事件
func (f *TForm1) OnFormCreate(sender vcl.IObject) {
	fmt.Println("onCreate")
	f.Button1 = vcl.NewButton(f) //创建一个按钮
	fmt.Println("f.Button1:", f.Button1.Instance())
	f.Button1.SetParent(f) //放置到子窗口上
	//f.Button1.SetName("Button1")
	f.Button1.SetCaption("我是按钮")
	//f.Button1.SetOnClick(f.OnButton1Click)
	//即使没有设置Button1的点击事件,下面的点击事件依然有效,似乎符合函数命名规定即有。
}

func (f *TForm1) OnButton1Click(object vcl.IObject) {
	vcl.ShowMessage("Click")
}

主窗口上通过按钮建立一个子窗口。整体看起来还是不复杂。代码也有比较多的中文说明。

我的环境是Ubuntu20.04,基本一个一个的运行了演示程序,不少都出现了错误,不能完整运行。若演示都不能正常带入,没办法用了…失败!


2020.7.28

现在的版本是2.0.5

我总是动态的看待问题,对人也对事,都是不断变化的。如果它什么时候符合自身了,改善了,就是值是得重新审视的。

govcl的中文文档还是可以,要大家用,写好文档是关键。

相关文章