GO,andlabsuiGUI库学习,从入门到放弃

本文记录andlabs/ui库的学习历程,选择它,是因为是go原生,无需带其他dll等文件,百度看介绍的时候功能也可以。准备用它写一个自动升级用的小工具,两三个窗口,以为能搞定的。

4月11号下午,开始学习andlabs/ui库,看文章,先下载库,但是go get 命令一直下载不了,最后给出一个没有go源文件的错误。尝试几次,改用方法二,在github官网,直接下载文件,然后解压,放到workspace内的src文件夹。访问境外网站是真慢,20K左右的网速,失败几次,终于下载成功。同时学习库文档资料,只有英文的,不过整理的挺规范。

学习文章地址:https://www.jianshu.com/p/456f072f58af

开发文档地址:https://godoc.org/github.com/andlabs/ui#pkg-index

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

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章