1. 简介

lxn/walk 是一个用于创建 Windows 图形用户界面(GUI)的 Go 语言库。它提供了一套简单易用的 API,可以用来创建各种窗口、对话框、按钮、标签、文本框等控件。在本教程中,我们将学习如何使用 lxn/walk 来创建一个简单的 GUI 应用程序。

  1. 安装

首先,我们需要安装 lxn/walk。可以通过在终端中使用以下命令来进行安装:

go get github.com/lxn/walk
go get github.com/akavel/rsrc ## 这个工具是用来生成.syso文件的,如果再cmd终端找不到rsrc命令,可以到GoPath或者GoRoot的/pkg/mod/github.com/akavel/rsrc目录下,执行go build命令,生成rsrc.exe文件,防止到/bin目录下
  1. 创建窗口

创建窗口是第一步。下面的代码演示了如何创建一个简单的窗口:

package main

import (
    "github.com/lxn/walk"
)

func main() {
    mw, _ := walk.NewMainWindow()
    mw.SetTitle("Hello, World!")
    mw.SetSize(walk.Size{Width: 300, Height: 200})
    mw.SetLayout(walk.NewVBoxLayout())
    mw.Show()
    mw.Run()
}
NewMainWindowSetTitleSetSizeShowwalk.Run
  1. 创建清单文件app.manifest,这个是应用程序配置元数据用的

输入如下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
        </windowsSettings>
    </application>
</assembly>

然后在终端使用命令rsrc将manifest文件转成syso文件

rsrc -manifest app.manifest -o app.syso # 如果不改版本,只要生成一次就行,可以重复使用
  1. 编译独立的exe文件,并双击运行即可 命令如下:
go build -ldflags="-H windowsgui"   

运行结果:

  1. 添加控件

下一步是添加控件。下面的代码演示了如何在窗口中添加一个标签和一个按钮:

package main

import (
    "github.com/lxn/walk"
)

func main() {
    mw, _ := walk.NewMainWindow()
    mw.SetTitle("Hello, World!")
    mw.SetSize(walk.Size{300, 200})

    label, _ := walk.NewLabel(mw)
    label.SetText("Hello, World!")
    label.SetBounds(walk.Rectangle{20, 20, 100, 20})

    button, _ := walk.NewPushButton(mw)
    button.SetText("Click me!")
    button.SetBounds(walk.Rectangle{20, 50, 80, 30})
    button.Clicked().Attach(func() {
        walk.MsgBox(mw, "Message", "Hello, World!", walk.MsgBoxIconInformation)
    })

    mw.Show()
    walk.Run()
}
NewLabelSetTextSetBoundsNewPushButtonSetTextSetBounds

显示结果:

  1. 未完待续......