用Go写Windows桌面应用 - 使用资源文件
这篇文章具有很强的时效性,是在2012年2月16日写的,这时Go1还没有发布,当前的Go编译器还无法嵌入资源文件。
接上篇。我们做出了一个简单的窗体,但有两个重大缺陷:没有程序图标和没有应用系统主题。现在我们就来着手解决。
使用图标和系统主题,并将资源文件签入exe
创建一个资源文件(推荐使用ResEdit),在其中加入图标(用作程序图标)和一个manifest文件(用于启用系统主题),如下图所示。
现在代码目录里面应该拥有以下文件。
之后,就要用到windres这个工具了,它的作用是把一个资源文件(*.rc)编译成*.o,之后就可以使用Go的pack工具把*.o一起包装到exe文件里。命令行如下。
windres resource.rc -o temp-rc.o
go tool 8g app.go
go tool pack grc _go_.8 app.8 temp-rc.o
go tool 8l –s –Hwindowsgui –o app.exe _go_.8
现在可以看到我们的app.exe已经拥有程序图标了。
运行之后可以看到,系统主题也有了。
至此,已经能用Go开发一些小工具了。另外,gform还提供了从资源文件中读取ico、png、jpg的接口,为自绘控件提供了便利。
资源文件的其他相关函数
读取图片资源
gform.NewBitmapFromResource(instance w32.HINSTANCE, resName *uint16, resType *uint16, background Color) (*Bitmap, error)
用法
//此处对应资源文件中的ID
IDR_DROPARROW = 108
bmp, err := gform.NewBitmapFromResource(
gform.GetAppInstance(), //应用程序实例
syscall.StringToUTF16Ptr("PNG"), //资源文件中的资源类型
w32.MakeIntResource(IDR_DROPARROW), //资源ID
gform.RGB(139, 190, 37)) //透明填充色
读取图标资源
gform.NewIconFromResource(instance w32.HINSTANCE, resId uint16) (*Icon, error)
用法
IDI_ICON1 = 101
ico, err := gform.NewIconFromResource(
gform.GetAppInstance(), //应用程序实例
w32.MakeIntResource(IDI_ICON1)) //图标资源ID
读取对话框资源
gform.NewDialogFromResId(parent Controller, resId uint) *Dialog
用法
IDD_MAIN = 103
mainform = gform.NewDialogFromResId(nil, IDD_MAIN)
mainform.Center()
mainform.Show()
这个就有意思了,在没有完整的窗体设计器出现之前,ResEdit已经可以协助很多控件定位的工作了!