想开发一个简单的 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 界面。
界面效果
项目目录结构
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 聊聊, 查看更多联系方式