用Go語言建立Windows視窗程式

2015-12-25    分類:其他、程式設計開發、首頁精華1人評論發表於2015-12-25

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

介紹

本文旨在說明如何在GO程式語言中使用Win32 API函式建立簡單的視窗。

這篇帖子簡單描述了用GO建立一個簡單視窗的步驟。要想獲取有關Go語言的更多資訊,可以訪問Go Document網站——https://golang.org/doc<wbr>

GO語言簡介

Go語言是一種開源程式語言,可以讓你輕鬆構建簡單,可靠,高效的軟體。

Go語言富有表現力,簡潔,乾淨,高效。它的併發機制使得它可以很容易地編寫讓多核和網路化的計算機發揮最大作用的程式,同時其新型的型別系統使得靈活且模組化的程式結構變得可能。Go語言能夠快速編譯為機器碼,並具備垃圾回收的便利以及執行時反射的能力。這是一個快速、靜態型別的編譯語言,並且讓人感覺像動態型別和解釋型的語言。

使用程式碼

本文假設你已經具備了Win32 API的基本知識。

在這個專案中,我使用的是Go語言的1.5.1 64位版本。

要在Go語言中使用Win32 API,我們需要’w32′包。該軟體包可以在Git Hub網站上找到——https://github.com/AllenDang/w32<wbr>

下面開始我們建立視窗之旅:

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
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章