Go语言Windows程序设计(2)--第一个窗口程序
2016-03-19 00:00
465 查看
上一篇中,通过winapi,我们成功的创建了一个弹出消息窗口,其中用到了MessageBox(...)这个接口。今天,正式开始写窗口程序,如果你熟悉C语言的windows程序,你就会发现后面的程序和C语言的很像,没错,其实就是用Go的语法去调用windows的api罢了,其基本结构还是类似的。说了那么多,还是先上些代码吧:
如上,首先是导入一些需要用到的包,其中
github.com/lxn/go-winapi 就是封装了windows api的一个开源包,和前一篇的一样哈,originWndProc声明了一个窗口句柄后面要用。
再后面是声明了窗口的高度和宽度的常量。分别是500和300,最下面的_TEXT方法的作用是将string类型数据转换成无符号16位整数指针的,后面将文字写到窗口上时需要调用。
再看剩下的:
上面的是一个窗口消息处理程序。它主要用来接收窗口消息,并根据消息类型来进行处理,如果不是很明白没关系,目前只要知道它是处理窗口消息的一个方法就行了,具体的机制以后专门讲。
最后写上主函数:
func main(){
var message MSG
var hwnd HWND
var wproc uintptr
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT(
"
EDIT
"),
_TEXT(
"
HELLO GUI
"),
WS_OVERLAPPEDWINDOW,
(GetSystemMetrics(SM_CXSCREEN)-winWidth)>>
1,
(GetSystemMetrics(SM_CYSCREEN)-winHeight)>>
1,
winWidth,
winHeight,
0,
0,
GetModuleHandle(
nil),
unsafe.Pointer(
nil))
wproc = syscall.NewCallback(WndProc)
originWndProc = HWND(SetWindowLong(hwnd,GWL_WNDPROC, int32(wproc)))
ShowWindow(hwnd,SW_SHOW)
for{
if GetMessage(&message,
0,
0,
0) ==
0{
break}
TranslateMessage(&message)
DispatchMessage(&message)
}
os.Exit(int(message.WParam))
}
其中的CreateWindowEx方法就是创建了一个窗口,方法的参数具体参考windows的api。创建后窗口后会返回一个窗口句柄hwnd,最后调用ShowWindow将hwnd句柄传给它,就能成功显示窗口了
最后的一个for循环就是循环接收接收到消息队列中的窗口消息,并交给之前的消息处理消息处理。当然实际过程没那么简单,目前,主要先实现功能,嘿嘿。最近忙着很多项目而且人也越来越懒,所以文章写得有些简单,千万别扔砖啊。。。。。。以后会逐渐补上具体的知识细节,当然,如果你等不及了,可以自己研究,其实和c的Windows程序设计一样的。是不是心动了?想看看go语言的Windows窗口?那就赶紧行动吧!最后上最终运行结果:
如上,首先是导入一些需要用到的包,其中
github.com/lxn/go-winapi 就是封装了windows api的一个开源包,和前一篇的一样哈,originWndProc声明了一个窗口句柄后面要用。
再后面是声明了窗口的高度和宽度的常量。分别是500和300,最下面的_TEXT方法的作用是将string类型数据转换成无符号16位整数指针的,后面将文字写到窗口上时需要调用。
再看剩下的:
上面的是一个窗口消息处理程序。它主要用来接收窗口消息,并根据消息类型来进行处理,如果不是很明白没关系,目前只要知道它是处理窗口消息的一个方法就行了,具体的机制以后专门讲。
最后写上主函数:
func main(){
var message MSG
var hwnd HWND
var wproc uintptr
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
_TEXT(
"
EDIT
"),
_TEXT(
"
HELLO GUI
"),
WS_OVERLAPPEDWINDOW,
(GetSystemMetrics(SM_CXSCREEN)-winWidth)>>
1,
(GetSystemMetrics(SM_CYSCREEN)-winHeight)>>
1,
winWidth,
winHeight,
0,
0,
GetModuleHandle(
nil),
unsafe.Pointer(
nil))
wproc = syscall.NewCallback(WndProc)
originWndProc = HWND(SetWindowLong(hwnd,GWL_WNDPROC, int32(wproc)))
ShowWindow(hwnd,SW_SHOW)
for{
if GetMessage(&message,
0,
0,
0) ==
0{
break}
TranslateMessage(&message)
DispatchMessage(&message)
}
os.Exit(int(message.WParam))
}
其中的CreateWindowEx方法就是创建了一个窗口,方法的参数具体参考windows的api。创建后窗口后会返回一个窗口句柄hwnd,最后调用ShowWindow将hwnd句柄传给它,就能成功显示窗口了
最后的一个for循环就是循环接收接收到消息队列中的窗口消息,并交给之前的消息处理消息处理。当然实际过程没那么简单,目前,主要先实现功能,嘿嘿。最近忙着很多项目而且人也越来越懒,所以文章写得有些简单,千万别扔砖啊。。。。。。以后会逐渐补上具体的知识细节,当然,如果你等不及了,可以自己研究,其实和c的Windows程序设计一样的。是不是心动了?想看看go语言的Windows窗口?那就赶紧行动吧!最后上最终运行结果:
相关文章推荐
- 让我们一起Go(六)
- 让我们一起Go(一)
- Go语言Windows程序设计(3)--创建子窗口
- 让我们一起Go(十三)
- 让我们一起Go(九)
- Golang控制goroutine的启动与关闭
- 让我们一起Go(五)
- Go语言Windows程序设计(4)--处理子窗体消息之按钮点击事件
- 让我们一起Go(十一)
- Go语言Windows程序设计(1)--简单弹出消息窗口
- 让我们一起Go(三)
- zoj--1951 Goldbach's Conjecture(math)
- AlphaGo 4:1 李世石
- google方程式
- go圣经笔记--第一章
- poj 1003 Hangover
- Codeforces Beta Round #5 A. Chat Server's Outgoing Traffic 水题
- Django1.9 制作个人简易博客
- OJ831 统计good及相关题
- Godaddy新手教程