Golang 在windows下walk窗口界面设计二

原创
2017/03/18 12:01
阅读数 1W

先看下window窗口的定义,这下就明朗了,walk的窗口是结构是这样定义的

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
}

 

看起来类型和方法很多的,直接上手,先显示一个窗口。看代码。

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()方法,那么窗口只是一闪而过。

因为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")
}

可以设置多种方法,我这里演示了几种方法,不再多演示。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部