Golang 在windows下walk窗口界面設計二

先看下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")
}

能夠設置多種方法,我這裏演示了幾種方法,再也不多演示。事件

相關文章
相關標籤/搜索