本文记录andlabs/ui库的学习历程,选择它,是因为是go原生,无需带其他dll等文件,百度看介绍的时候功能也可以。准备用它写一个自动升级用的小工具,两三个窗口,以为能搞定的。
4月11号下午,开始学习andlabs/ui库,看文章,先下载库,但是go get 命令一直下载不了,最后给出一个没有go源文件的错误。尝试几次,改用方法二,在github官网,直接下载文件,然后解压,放到workspace内的src文件夹。访问境外网站是真慢,20K左右的网速,失败几次,终于下载成功。同时学习库文档资料,只有英文的,不过整理的挺规范。
4月12日、13日,两天时间,经历了从入门到放弃。
先将文档大体看了一遍,了解基本结构。仿着文章,添加了简单标签、文本框、按钮等控件,新建一个窗口展示。这样挺顺利的,介绍andlabs/ui库的文章,基本都到这一步。百度一个安装窗口,想要仿着做一下。图片如下:
我需要页面上部,是大字号的文字。难点来了,如何设置将标签的文字设置字体、字号?百度的前5页内容都看过了,没有介绍。进GO群问问,直接劝放弃(现在想别人还真是说对了)。终于在github官网找到四个示例,复制到本地,仔细研读,drawtext的示例,有设置文本字体、字号的内容。因为go语言也不熟,磕磕绊绊,终于,搞定了这个问题。
跟原界面比是差太多,想过将上边的文字弄个图片,这个库也有image。
继续前进,需要布局按钮,设置按钮和按钮文字的大小。到这时候,我发现我没办法搞定了,BOX的Append函数,stretchy参数,控制添加的控件,是固定大小的,还是均分空间,只支持这两种,要搞个3:7,2:8的比例分配空间,找遍示例和资料,也没找到。再一个问题,是按钮控件内文字的字体等设置。我也没找到,猜测如果实现的话,也是area的方式吧,太麻烦。最终决定放弃这个GUI库,更换其他的GUI,心里也就接受了带其他DLL文件,大不了搞个rar压缩包,正好可以带上配置文件。
其他GUI库的选择,看文章介绍,walk、electron,这两个库挺不错,但是我都没接触过。之前学习过sciter,暂决定使用go-sciter试一把。
//新建area
type areaHandlertitle struct {
areaHandlerbase
}
func (areaHandlertitle) Draw(a *ui.Area, p *ui.AreaDrawParams) {
var attrstr_title *ui.AttributedString
var font ui.FontDescriptor
font.Family = ui.TextFamily("Courier New")
font.Italic = ui.TextItalicItalic
font.Size = ui.TextSize(18)
font.Stretch = ui.TextStretchCondensed
font.Weight = ui.TextWeightBold
attrstr_title = ui.NewAttributedString("欢迎使用**软件")
tl := ui.DrawNewTextLayout(&ui.DrawTextLayoutParams{
String: attrstr_title,
DefaultFont: &font,
Width: p.AreaWidth,
Align: ui.DrawTextAlign(ui.AlignCenter),
})
defer tl.Free()
p.Context.Text(tl, 0, 0)
}
//首页窗口
func indexwindow() {
err := ui.Main(func() {
//新建控件
lb_title := ui.NewLabel("欢迎使用**软件")
//新建area
larea_title := ui.NewArea(areaHandlertitle{})
//新建路径文本编辑框
entry := ui.NewEntry()
//新建路径选择按钮
btn := ui.NewButton("浏览")
btn2 := ui.NewButton("安装")
//新建窗口
window := ui.NewWindow("**软件安装、升级工具", 700, 500, true)
//生成垂直容器
vbox := ui.NewVerticalBox()
vbox.SetPadded(true)
//生成水平容器
hbox := ui.NewHorizontalBox()
//向水平容器添加控件
hbox.Append(entry, false)
hbox.Append(btn, true)
hbox.Append(btn2, true)
//向容器添加控件
vbox.Append(larea_title, true)
vbox.Append(lb_title, true)
vbox.Append(hbox, true)
// box.Append(larea_title, true)
//窗口容器绑定
window.SetChild(vbox)
//设置窗口关闭事件
window.OnClosing(func(*ui.Window) bool {
//窗口关闭
ui.Quit()
return true
})
//显示窗口
window.Show()
})
if err != nil {
panic(err)
}
}
UIPublic.go
package main
import (
"github.com/andlabs/ui"
)
//UI库的公用二次封装库
type areaHandlerbase struct {
}
func (areaHandlerbase) Draw(a *ui.Area, p *ui.AreaDrawParams) {
// do nothing
}
func (areaHandlerbase) MouseEvent(a *ui.Area, me *ui.AreaMouseEvent) {
// do nothing
}
func (areaHandlerbase) MouseCrossed(a *ui.Area, left bool) {
// do nothing
}
func (areaHandlerbase) DragBroken(a *ui.Area) {
// do nothing
}
func (areaHandlerbase) KeyEvent(a *ui.Area, ke *ui.AreaKeyEvent) (handled bool) {
// reject all keys
return false
}