先看下window窗口的定義,這下就明朗了,walk的窗口是結構是這樣定義的git
type MainWindow struct { AssignTo **walk.MainWindow //關聯 Name string //窗口名 一旦設置了沒法更改 Enabled Property //是否禁用 Visible Property //可視化 Font Font //字體 MinSize Size //最小化尺寸 MaxSize Size//最大化尺寸 ContextMenuItems []MenuItem //窗口菜單欄 OnKeyDown walk.KeyEventHandler //鍵盤按下 OnKeyPress walk.KeyEventHandler //鍵盤按下前的事件,不把按鍵的結果返回計算機。 OnKeyUp walk.KeyEventHandler //鍵盤擡起 OnMouseDown walk.MouseEventHandler//鼠標點下 OnMouseMove walk.MouseEventHandler //鼠標移動 OnMouseUp walk.MouseEventHandler//鼠標擡起 OnDropFiles walk.DropFilesEventHandler //拖動文件到窗口 OnSizeChanged walk.EventHandler //尺寸改變 Title string //窗口標題 Size Size //窗口正常化尺寸 DataBinder DataBinder//數據綁定 Layout Layout//窗口布局 Children []Widget //子控件wiget,包含容器,控件等。 MenuItems []MenuItem//菜單欄設置 ToolBarItems []MenuItem // Deprecated, use ToolBar instead //工具欄已經廢棄,用下面的ToolBar ToolBar ToolBar }
看起來類型和方法不少的,直接上手,先顯示一個窗口。看代碼。github
import ( //"github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) func main() { MainWindow{ Name: "demo", Title: "我是demo", MinSize: Size{300, 200}, }.Run() }
運行效果:工具
短短几句代碼就生成一個窗口,佈局
咱們先分析看下walk中run方法的定義。字體
func (mw MainWindow) Run() (int, error) { var w *walk.MainWindow if mw.AssignTo == nil { mw.AssignTo = &w } if err := mw.Create(); err != nil { return 0, err } return (*mw.AssignTo).Run(), nil }
能夠看到一直回調Run()這個方法,這說明了窗口是一直繪製的,假如咱們一次調用裏面的mw.Create()方法,那麼窗口只是一閃而過。ui
由於window窗口繪製涉及到很複雜的東西,包含初始化、各類窗口消息、子類化、繼承等等。沒法一下講完,研究GO語言繪製出UI纔是咱們的正道,不然有點捨本逐末,咱們最求的是結果,無需關心底層的實現,只講實現纔是正確的選擇。設計
一個窗口還不行,得添加個按鈕,好比添加按鈕後,咱們點擊按鈕,修改按鈕標題.繼承
import ( "syscall" "unsafe" "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) func main() { var w *walk.MainWindow var a *walk.PushButton MainWindow{ AssignTo: &w, Name: "ok", Title: "我是demo", MinSize: Size{300, 200}, Layout: VBox{}, //佈局 Children: []Widget{ //不動態添加控件的話,在此佈局或者QT設計器設計UI文件,而後加載。 PushButton{ Text: "點擊我修改按鈕標題", AssignTo: &a, OnClicked: func() { //update(a) 方法1。或者直接把a做爲全局變量,無需傳遞a 。或者直接定義結構體,添加方法。 a.SendMessage(12, uintptr(0), uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("hello")))) //方法2 }, }, }, }.Run() } func update(a *walk.PushButton) { a.SetText("hello") }
能夠設置多種方法,我這裏演示了幾種方法,再也不多演示。事件