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

}

 

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