上一篇中,通過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視窗?那就趕緊行動吧!最後上最終運行結果: