文档章节

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

大洋的顶端
 大洋的顶端
发布于 2017/03/18 12:01
字数 665
阅读 1190
收藏 1

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

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

© 著作权归作者所有

大洋的顶端
粉丝 17
博文 30
码字总数 13805
作品 0
广州
私信 提问
golang图形编程(lxn/walk)

说明: golang没有提供图形库,促生了一些第三方库,walk就是其中之一,但是walk不是跨平台的,仅能在windows平台下使用。 接下来使用walk编写一个例子。前提是golang、git的环境已经配置好了...

李文良
2015/12/23
1K
0
go windows 编程

golang windowns 编程包下载 windows需要先安装git for Windows go get github.com/lxn/walk go get github.com/lxn/win 运行时隐藏dos命令行窗口编译命令 go build -ldflags -H=windowsgui ......

guhongzi
2014/12/06
0
0
Go语言开发Windows应用

当第一次看到Go程序在windows平台生成可执行的exe文件,就宣告了windows应用也一定是Go语言的战场。Go不是脚本语言,但却有着脚本语言的轻便简单的特性。相较于php和python之类以服务器控制台...

Robin3D
2013/04/24
3.9K
4
golang 开发windows应用

闲着无聊又玩go语言找虐。。。——用go开发windows应用程序 想要用go开发windows应用必须先要安装必要的组件: walk集成了很多windows的控件 go get github.com/lxn/walk win是go调用windows...

KelvinQ
2015/02/05
1K
0
DirectUI 界面库--DuiLib

国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 、Window CE、Mobile等平台。 Duilib 是一款强大的界面开发工具,可以将...

wangchyz
2011/06/01
122.1K
4

没有更多内容

加载失败,请刷新页面

加载更多

规则引擎

解决问题 版本迭代速度更不上业务变化,但是若多个业务同时变化,除了为每个业务设计专属配置项也不利于操作。就想服务接口单纯化,将复杂多变的业务逻辑交给规则引擎,让用户在web端或cs端自...

无极之岚
25分钟前
4
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
今天
215
9
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
10
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部