用Go語言建立Windows視窗程式
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
介紹
本文旨在說明如何在GO程式語言中使用Win32 API函式建立簡單的視窗。
這篇帖子簡單描述了用GO建立一個簡單視窗的步驟。要想獲取有關Go語言的更多資訊,可以訪問Go Document網站——https://gola
GO語言簡介
Go語言是一種開源程式語言,可以讓你輕鬆構建簡單,可靠,高效的軟體。
Go語言富有表現力,簡潔,乾淨,高效。它的併發機制使得它可以很容易地編寫讓多核和網路化的計算機發揮最大作用的程式,同時其新型的型別系統使得靈活且模組化的程式結構變得可能。Go語言能夠快速編譯為機器碼,並具備垃圾回收的便利以及執行時反射的能力。這是一個快速、靜態型別的編譯語言,並且讓人感覺像動態型別和解釋型的語言。
使用程式碼
本文假設你已經具備了Win32 API的基本知識。
在這個專案中,我使用的是Go語言的1.5.1 64位版本。
要在Go語言中使用Win32 API,我們需要’w32′包。該軟體包可以在Git Hub網站上找到——https://github.com/A
下面開始我們建立視窗之旅:
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
函式,以將Go string
型別轉換到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語言是一種非常優秀的程式語言。我希望本文能對初級程式設計師有所幫助。
譯文連結:http://www.codeceo.com/article/go-create-window.html
英文原文:Creating A Window In Go Language
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- C語言建立空白Windows視窗程式碼C語言Windows
- Go Qt5 建立空白視窗、視窗居中及關閉視窗事件GoQT事件
- Windows API視窗程式設計 - 空白視窗WindowsAPI程式設計
- [Go語言寫介面]二、簡單美化視窗,設定視窗圖示,簡單美化資訊框,建立按鈕和註冊事件Go事件
- windows下安裝go語言WindowsGo
- 用Go語言寫一個Windows的外掛(上)GoWindows
- 使用Go語言建立WebSocket服務GoWeb
- 使用 Go 語言建立 WebSocket 服務GoWeb
- Go語言RESTful JSON API建立GoRESTJSONAPI
- 建立多視窗的Windowsform程式WindowsORM
- go語言偵錯程式Go
- 用C語言編寫windows服務程式C語言Windows
- 用 Go 語言理解 TensorflowGo
- Windows7系統下如何快速啟用程式視窗Windows
- Go語言————1、初識GO語言Go
- 將GO編繹成JavaScript,用GO語言來寫前端程式碼GoJavaScript前端
- Go語言(1)——程式結構Go
- Google釋出go程式語言Go
- win32的建立視窗程式碼Win32
- Go語言反射(reflect)及應用Go反射
- GO語言Go
- Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 7、滑動視窗套路演算法框架——Go語言版演算法框架Go
- 用Nim語言開發windows GUI圖形介面程式WindowsGUI
- GO語言————2、GO語言環境安裝Go
- Go 語言程式設計規範Go程式設計
- Go語言併發程式設計Go程式設計
- GO是更好的程式語言嗎?Go
- Go程式語言評估報告Go
- 20天學會go語言視訊教程Go
- [譯] Go 語言實戰: 編寫可維護 Go 語言程式碼建議Go
- 許式偉《Go語言程式設計》章節摘錄:Go語言簡史Go程式設計
- Go語言核心36講(Go語言實戰與應用七)--學習筆記Go筆記
- Go語言核心36講(Go語言實戰與應用八)--學習筆記Go筆記
- Go語言核心36講(Go語言實戰與應用二)--學習筆記Go筆記
- Go語言核心36講(Go語言實戰與應用四)--學習筆記Go筆記
- Go語言核心36講(Go語言實戰與應用五)--學習筆記Go筆記
- Go語言核心36講(Go語言實戰與應用十七)--學習筆記Go筆記