用Go语言创建Windows窗口程序
2015-12-26 15:05:31 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:用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_APPLICATIONIDC_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)– 小峰
[转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]

tags:

上一篇  下一篇

相关:

伟大的工程背后,多亏了这些奇妙的小零件

扣件 (Fasteners) 是将钢轨 (Rail) 固定在轨枕 (Tie) 上的部件,包括道钉 (Spikes)、弹条扣件 (Clips) 等,

不太会做饭,放假回家又想露一手,那就学会这几个菜

会做菜的肯定不会到处找菜谱,也不会急着露两手给爸妈看,所以这次的菜谱的面向目标是没有太多经验,甚至零

大夫我太疼了!做完手术哪有不疼的,这个钮,自己按

第五大生命体征—–疼痛这次,二麻哥和大家一起讨论一下,很多外科医生和患者家属常说的 —

68页PPT图解《中国制造 2025》新材料技术路线图

10月30日,中华人民共和国工业和信息化部官方网站正式公布《<中国制造2025>重点领域技术路线图(2015年版)

股市技术学习资料

我最早在2007年投资,但真正开始学习技术,是从2009年开始,大学的选修课中有证券投资分析这门,同时也顺便

小楼技术:个股底部结构 (带你地板上找牛股)

小楼技术:盆底掌握技巧:颈线永远不要被击穿 ,击穿就可以减仓。文章内容:盆底知识、案例学习、福利大放送

付费12.28鹰氏技术讲堂——揉搓K线组合$凤凰股票池

Sayings:#鹰氏操盘学#秉承技术最简单最实用精神,一直追求卓越。鹰家军的精神就是一个“打”字,just do it

手机微博微博商业技术部联合技术沙龙圆满结束

群英荟萃 博采众长由手机微博及微博商业技术部联合策划和组织的线下技术沙龙,于2015年12月18日顺利举行。主

未雨绸缪——论技术分析的未来

注册制已经绕过人大修法,先行授权探路。方星海明确了来年的五个任务,按我个人的比喻,还是搭建好不同等级

关于2015年度第三十一批一级建造师注册人员名单的公示

根据《注册建造师管理规定》(建设部令第153号)和《关于印发的通知》(建市[2007]第101号),经审核,李为

站长推荐: