原标题:用Go语言创建Windows窗口程序
本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎加入技术翻译小组!
介绍本文旨在说明如何在GO编程语言中使用Win32 API函数创建简单的窗口。
这篇帖子简单描述了用GO创建一个简单窗口的步骤。要想获取有关Go语言的更多信息,可以访问Go Document网站——https://golang.org/doc。
GO语言简介Go语言是一种开源编程语言,可以让你轻松构建简单,可靠,高效的软件。
Go语言富有表现力,简洁,干净,高效。它的并发机制使得它可以很容易地编写让多核和网络化的计算机发挥最大作用的程序,同时其新型的类型系统使得灵活且模块化的程序结构变得可能。Go语言能够快速编译为机器码,并具备垃圾回收的便利以及运行时反射的能力。这是一个快速、静态类型的编译语言,并且让人感觉像动态类型和解释型的语言。
使用代码本文假设你已经具备了Win32 API的基本知识。
在这个项目中,我使用的是Go语言的1.5.1 64位版本。
要在Go语言中使用Win32 API,我们需要’w32′包。该软件包可以在Git Hub网站上找到——https://github.com/AllenDang/w32
下面开始我们创建窗口之旅:
Go源文件中的第一条语句必须是包的名称。由于我们要写的程序是一个可执行程序,所以包的名称必须是main。它告诉Go编译器这个包应编译为可执行程序,而不是一个共享库:
package main
在Go语言中,import关键字用于导入包到其他包。因此,我们以这种方式使用import
关键字导入我们需要的软件包:
import "./w32" // I had putted the w32 package inside the project source folder -
我们还需要导入以下的软件包:
import "syscall" import "unsafe"
Unsafe
是Go语言一个内置的包。它提供用于低级编程包括违反类型系统操作在内的设施。我们需要它转换uintptr
类型至指针,而且这个包中还包含了一个名为Sizeof的函数。我们将使用Sizeof函数获取WNDCLASSEX
结构的大小。
这是一个简单的windows照片id至uint16
指针转换器函数。我们需要它来传递IDI_APPLICATION
和IDC_ARROW
常数到LoadIcon
和LoadCursor函数参数。在Go语言中,类型转换表达式为T(v),它将值v转换至类型T:
func MakeIntResource(id uint16) (*uint16) { return (*uint16)(unsafe.Pointer(uintptr(id))) }
这是窗口消息处理函数,只处理WM_DESTROY消息,以确保窗口在close
事件时能够正常关闭:
func WndProc(hWnd w32.HWND, msg uint32, wParam, lParam uintptr) (uintptr) { switch msg { case w32.WM_DESTROY: w32.PostQuitMessage(0) default: return w32.DefWindowProc(hWnd, msg, wParam, lParam) } return 0 }
下面的WinMain
函数可以创建窗口,并运行一个标准的应用程序循环:
func WinMain() int {
在一个命名为hInstance的局部变量中获得应用程序实例句柄。在Go语言中,:=运算符担任立即声明和初始化的作用:
hInstance := w32.GetModuleHandle("")
由于w32
包只定义Unicode(UTF16)兼容的WinAPI函数,所以我们必须使用来自于syscall
包的StringToUTF16Ptr
函数,以将Gostring
类型转换到UTF16指针:
lpszClassName := syscall.StringToUTF16Ptr("WNDclass")
在这里,我们用’var’关键字声明变量:
var wcex w32.WNDCLASSEX
分配使用’=’运算符即可:
wcex.Size = uint32(unsafe.Sizeof(wcex)) wcex.Style = w32.CS_HREDRAW | w32.CS_VREDRAW wcex.WndProc = syscall.NewCallback(WndProc) wcex.ClsExtra = 0 wcex.WndExtra = 0 wcex.Instance = hInstance wcex.Icon = w32.LoadIcon(hInstance, MakeIntResource(w32.IDI_APPLICATION)) wcex.Cursor = w32.LoadCursor(0, MakeIntResource(w32.IDC_ARROW)) wcex.Background = w32.COLOR_WINDOW + 11
在Go语言中,nil
等同于NULL。因为我们没有为窗口提供任何菜单,所以我们分配MenuName
字段为nil:
wcex.MenuName = nil wcex.ClassName = lpszClassName wcex.IconSm = w32.LoadIcon(hInstance, MakeIntResource(w32.IDI_APPLICATION))
我们使用w32
包的RegisterClassEx
函数注册类。传递wcex
变量的地址到其参数—
w32.RegisterClassEx(&wcex)
然后,我们使用w32
包的CreateWindowEx
函数创建窗口。窗口大小为400×400:
hWnd := w32.CreateWindowEx( 0, lpszClassName, syscall.StringToUTF16Ptr("Simple Go Window!"), w32.WS_OVERLAPPEDWINDOW | w32.WS_VISIBLE, w32.CW_USEDEFAULT, w32.CW_USEDEFAULT, 400, 400, 0, 0, hInstance, nil)
使用w32
包的ShowWindow
函数在屏幕上显示窗口:
w32.ShowWindow(hWnd, w32.SW_SHOWDEFAULT) w32.UpdateWindow(hWnd)
下面的代码将运行标准的应用程序循环,直到我们关闭窗口。它可以在窗口中获取消息:
var msg w32.MSG for { if w32.GetMessage(&msg, 0, 0, 0) == 0 { break } w32.TranslateMessage(&msg) w32.DispatchMessage(&msg) } return int(msg.WParam) }
这是程序的入口点函数。它调用WinMain
函数来创建和显示窗口:
func main() { WinMain() return }
现在,我们有源代码了。我已经将源文件名命名为main.go。
使用以下命令编译源文件:
go.exe build -ldflags "-H windowsgui" main.go
‘-ldflags
‘和’-H windowsgui
‘标记将从应用程序中删除黑色的控制台窗口。
现在,运行main.exe文件,看看你写的Go语言窗口!
致读者如果各位有关于Go语言的可以帮助大家轻松学习的新项目,欢迎能够多多交流。
结论Go语言是一种非常优秀的编程语言。我希望本文能对初级程序员有所帮助。
应用程序预告 源代码预告
译文链接:
英文原文:Creating A Window In Go Language
翻译作者:玩赚乐(www.banghui.org)– 小峰
[转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]
相关:
扣件 (Fasteners) 是将钢轨 (Rail) 固定在轨枕 (Tie) 上的部件,包括道钉 (Spikes)、弹条扣件 (Clips) 等,
会做菜的肯定不会到处找菜谱,也不会急着露两手给爸妈看,所以这次的菜谱的面向目标是没有太多经验,甚至零
第五大生命体征—–疼痛这次,二麻哥和大家一起讨论一下,很多外科医生和患者家属常说的 —
10月30日,中华人民共和国工业和信息化部官方网站正式公布《<中国制造2025>重点领域技术路线图(2015年版)
我最早在2007年投资,但真正开始学习技术,是从2009年开始,大学的选修课中有证券投资分析这门,同时也顺便
小楼技术:盆底掌握技巧:颈线永远不要被击穿 ,击穿就可以减仓。文章内容:盆底知识、案例学习、福利大放送
Sayings:#鹰氏操盘学#秉承技术最简单最实用精神,一直追求卓越。鹰家军的精神就是一个“打”字,just do it
群英荟萃 博采众长由手机微博及微博商业技术部联合策划和组织的线下技术沙龙,于2015年12月18日顺利举行。主
注册制已经绕过人大修法,先行授权探路。方星海明确了来年的五个任务,按我个人的比喻,还是搭建好不同等级
根据《注册建造师管理规定》(建设部令第153号)和《关于印发的通知》(建市[2007]第101号),经审核,李为