Golang Walk 开发 Windows GUI 应用,Hello World 示例

文章目录

    想开发一个简单的 Windows GUI 应用,实现证书图片的批量生成功能。

    选择 Golang 开发 Windows GUI 的原因

    尝试了一圈 WPF, React Native for Windows, 我感觉还是 Golang 开发更顺手一些。
    不常写 C#,一段时间不写,语法就忘了。

    而且这个证书图片的生成功能,我已经用 Golang Gin 实现了一套服务端的接口。
    现在只需要把这部分代码移植到 Windows GUI 上就可以了。

    使用 Golang Walk 库

    也调研了其他的 Golang GUI 库:

    • Fyne:依赖较多,而且我运行不起来
    • Wails: WebView2 的方案,但我接受不了还有 Node JS 依赖
    • gtk3: 需要额外安装 gtk3 库

    后来我转头一想,为何不能用 Golang 直接调用 Win32 API 呢?于是我找到了 Walk 库。

    安装非常简单,立马就能运行起来,简单易上手。

    下面演示一下如何实现一个 Hello World 的 GUI 应用。

    Hello World 示例

    参考,官方 github 上的示例代码,新建一个 main.go 文件:

    package main
    
    import (
    	"strings"
    
    	"github.com/lxn/walk"
    	. "github.com/lxn/walk/declarative"
    )
    
    func main() {
    	var inTE, outTE *walk.TextEdit
    
    	MainWindow{
    		Title:   "Hello World",
    		MinSize: Size{600, 400},
    		Layout:  VBox{},
    		Children: []Widget{
    			HSplitter{
    				Children: []Widget{
    					TextEdit{AssignTo: &inTE},
    					TextEdit{AssignTo: &outTE, ReadOnly: true},
    				},
    			},
    			PushButton{
    				Text: "SCREAM",
    				OnClicked: func() {
    					outTE.SetText(strings.ToUpper(inTE.Text()))
    				},
    			},
    		},
    	}.Run()
    }
    

    初始化项目

    go mod init go_gui_cert
    go mod tidy
    

    Manifest 文件

    创建一个 main.manifest 文件,命名为 main.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>
    

    因为 Walk 库使用了 Windows Common Controls 6.0,所以需要这个 Manifest 文件。

    Common Controls(通用控件) 是微软 Windows 系统提供的一套标准化 GUI 组件库,包含了一系列常用的界面元素,用于简化 Windows 应用程序的开发,确保不同程序在界面风格和交互逻辑上保持一致性。

    主要特点:

    • 标准化组件:提供了按钮、列表视图、树状视图、进度条、滑块、标签页、日期选择器等常见控件,开发者无需重复开发这些基础元素。
    • 系统级支持:作为 Windows 系统的一部分(主要通过 comctl32.dll 动态链接库实现),这些控件与系统深度集成,能自动适配 Windows 的视觉风格(如 XP、Vista、Win10/11 的主题)。
    • 版本演进:随着 Windows 系统更新,Common Controls 也在迭代,例如从早期的版本 1.0 到后来的版本 6.0(支持更现代的视觉样式)。

    编译 manifest 文件

    需要先安装 rsrc 工具:

    rsrc - Tool for embedding binary resources in Go programs.

    rsrc 是一个用于将二进制资源嵌入到 Go 程序中的工具。
    它可以将资源文件(如图标、字符串表、版本信息等)转换为 Go 可用的格式,并生成相应的 Go 代码或二进制文件。

    go install github.com/akavel/rsrc
    

    编译:

    rsrc -manifest main.manifest -o rsrc.syso
    

    编译运行

    go build -ldflags="-H windowsgui"
    

    后面的参数是为了不显示 cmd 控制台窗口。编译速度非常快,秒完成。👍

    这时候,就会看到生成了一个 exe 文件,双击运行就可以看到一个简单的 GUI 界面。

    界面效果

    Golang Walk Hello World 界面

    项目目录结构

     305 Jul 29 08:45 go.mod
    1.0K Jul 29 08:45 go.sum
    7.3M Jul 29 10:12 go_gui_cert.exe
     553 Jul 29 10:12 main.go
     889 Jul 29 08:45 main.manifest
    1.1K Jul 29 08:46 rsrc.syso
    

    生成的 exe 文件大约 7.3M,文件大小完全可以接受。

    换台电脑运行

    把生成的 exe 文件拷贝到其他 Windows 电脑上运行,发现可以正常运行。

    只需要一个 exe 文件即可,不需要额外的依赖。两个系统均是 Windows 11。

    完美!

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式