幾個月以前看到了Go的消息,讀完入門PPT之后,便有種感覺,這就是我想象中的語言。語法簡單,寫起來手感極好,設計則處處透着簡潔。
隨后便開始用它代替python寫一些常用小工具,堪稱得心應手。幾個月以后,日益離不開了,再用別的語言時總覺得缺了點什么。
我很喜歡寫桌面應用,之前一直用C++,但實在不喜歡它那復雜的設計,而且也沒有找到合心意的UI庫。此時心里冒出了一個念頭,用Go寫一套UI庫。很大膽,很冒險,甚至很二。很多人都提醒到,UI庫這種龐大的東西靠一個人是不可能完成的。我也經常在掙扎,但還是沒忍住這股沖動,我動手了!
從零開始封裝win32 api,工作量挺大的,但好在已經有很多前輩已經在C++里面做過同樣的事情了,所以倒也還順利。
好了,話不多說,就先看看代碼吧!是騾子是馬拉出來溜溜。
第一步,先安裝gform,也就是我封裝的UI庫。確認用的是最新的Weekly版本的Go,然后打開命令行運行下面兩行。
go get github.com/AllenDang/gform
go install github.com/AllenDang/gform
搞定,因為go命令會自動檢測庫依賴,所以也會順帶把w32,我封裝的win32 api庫,安裝好。
好了,現在可以創建一個空窗體。
package main
import (
"github.com/AllenDang/gform"
)
func main() {
gform.Init()
mainform := gform.NewForm(nil)
mainform.SetSize(300, 200)
mainform.Center()
mainform.Show()
gform.RunMainLoop()
}
用下面命令行編譯
go tool 8g app.go
go tool 8l –s –Hwindowsgui –o app.exe app.8
運行app.exe,窗體出來了,應用程序體積706kb,沒有任何依賴的dll,用upx壓縮后219kb,很好,我滿意了。
現在來添加一個按鈕吧,點擊它之后能彈出一個“Hello world”的消息框。
先添加對"w32”這個包的應用
import (
"github.com/AllenDang/gform"
"github.com/AllenDang/w32"
)
然后添加按鈕
btnOk := gform.NewPushButton(mainform)
btnOk.SetCaption("點我")
btnOk.SetPos(100, 10)
btnOk.OnLBUp().Attach(btnOK_OnLBUp)
添加事件處理函數
func btnOK_OnLBUp(arg *gform.EventArg) {
gform.MsgBox(arg.Sender(), "消息", "Hello world", w32.MB_OK|w32.MB_ICONINFORMATION)
}
搞定!修改后的完整代碼如下
package main
import (
"github.com/AllenDang/gform"
"github.com/AllenDang/w32"
)
func btnOK_OnLBUp(arg *gform.EventArg) {
gform.MsgBox(arg.Sender(), "消息", "Hello world", w32.MB_OK|w32.MB_ICONINFORMATION)
}
func main() {
gform.Init()
mainform := gform.NewForm(nil)
mainform.SetSize(300, 200)
mainform.Center()
btnOk := gform.NewPushButton(mainform)
btnOk.SetCaption("點我")
btnOk.SetPos(100, 10)
btnOk.OnLBUp().Attach(btnOK_OnLBUp)
mainform.Show()
gform.RunMainLoop()
}
運行,怎么樣?
夠簡單嗎?恩,我承認,不簡單,純編碼的方式創建UI很折磨人,特別是控件定位。別着急,gform還支持另外一種方式創建UI,使用資源文件,其實熟悉win32 gui體系的朋友應該很熟悉這種方式。
另外,大家也可能注意到按鈕的樣式不正常,並沒有應用windows系統的控件樣式,這在下一篇里面會提到解決方法。