本文記錄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
}