Golang Walk 增加 Windows 应用图标

文章目录

    用 Golang Walk 开发了一个 Windows GUI 应用程序,用于批量生成决赛证书。
    基础功能已经完成。目前唯一的遗憾是应用程序没有图标。为了让这个应用程序看起来更专业,我决定为它添加一个图标。

    先看最终效果:

    显示效果

    Golang Walk Windows 应用图标

    重新生成 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式