用 Golang Walk 开发了一个 Windows GUI 应用程序,用于批量生成决赛证书。 基础功能已经完成。目前唯一的遗憾是应用程序没有图标。为了让这个应用程序看起来更专业,我决定为它添加一个图标。
先看最终效果:
显示效果
重新生成 syso 文件
参考 Github 上的一个套路:
https://github.com/lxn/walk/issues/361
首先去 iconfont 网站下载一个免费的图标文件,然后将其转换为 ICO 格式。可以使用在线工具或软件来完成这个转换。
然后将生成的 ICO 文件放在项目目录下,例如 main.ico。
重新生成 syso 文件,使用以下命令:
rsrc -manifest main.manifest -ico main.ico -o rsrc.syso
其实就是在之前的基础上,增加了 -ico main.ico
参数。
修改 golang 代码
需要在代码中引用这个图标文件。可以在 main.go
文件中添加以下代码:
// number 2 is resource ID printed by RSRC.exe while making accounting.syso
var appIcon, _ = walk.NewIconFromResourceId(2)
func main() {
var outTE *walk.TextEdit
decl.MainWindow{
Title: "决赛证书批量生成工具",
Icon: appIcon, // 使用上面定义的图标
Size: decl.Size{Width: 600, Height: 400},
Layout: decl.VBox{},
// ...
如果不加 Icon: appIcon
,则不会显示图标,只会看到文件目录里 exe 文件有了图标,但运行时窗口没有图标。
重新编译 exe 文件
go build -ldflags="-H windowsgui"
然后打开就可以看到图标了。
resource ID 问题
如果直接使用上面链接的里的 resource ID 3,可能会导致运行时错误:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x7a511c]
然后我在另一个 issue 中找到了解决方案,就是替换 3 为 2:
Maybe you can try to change resource ID 3 to 2 if you are using akavel/rsrc v0.10
这也太抽象了,虽然确实可以解决问题,但我还是不太明白为什么。
然后有人推荐了 https://github.com/josephspurrier/goversioninfo 这个工具来解决。 有空再看看吧。
如何确定 syso 文件中的 icon 文件的 resource ID?
https://github.com/akavel/rsrc/issues/20
有人 fork 了一个版本,可以输出 icon 对应的 resource ID.
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式