上一篇中,通過winapi,我們成功的創建了一個彈出消息窗口,其中用到了MessageBox(...)這個接口。今天,正式開始寫窗口程序,如果你熟悉C語言的windows程序,你就會發現后面的程序和C語言的很像,沒錯,其實就是用Go的語法去調用windows的api罷了,其基本結構還是類似的。說了那么多,還是先上些代碼吧:
如上,首先是導入一些需要用到的包,其中
github.com/lxn/go-winapi 就是封裝了windows api的一個開源包,和前一篇的一樣哈,originWndProc聲明了一個窗口句柄后面要用。
再后面是聲明了窗口的高度和寬度的常量。分別是500和300,最下面的_TEXT方法的作用是將string類型數據轉換成無符號16位整數指針的,后面將文字寫到窗口上時需要調用。
再看剩下的:
上面的是一個窗口消息處理程序。它主要用來接收窗口消息,並根據消息類型來進行處理,如果不是很明白沒關系,目前只要知道它是處理窗口消息的一個方法就行了,具體的機制以后專門講。
最后寫上主函數:
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窗口?那就趕緊行動吧!最后上最終運行結果: