一、先獲取xcgui庫
go get github.com/twgh/xcgui
二、到網盤下載xcgui.dll
網盤裡有64位的和32位的dll,一般選擇64位的,go編譯的程式預設也是64位的。
xcgui.dll需要和編譯出來的程式放在一起,但每寫一個程式都重複放的話就很麻煩了。
在開發時我建議把xcgui.dll放到C:\Windows\System32
目錄下,這樣就不需要每次都把dll和程式放在一起了。
三、開始寫程式碼
剛開始你只需要知道3個包,程式包:app
、視窗包:window
、常量包:xcc
。
四、最簡單的程式程式碼
package main
import (
"github.com/twgh/xcgui/app"
"github.com/twgh/xcgui/window"
"github.com/twgh/xcgui/xcc"
)
func main() {
// 炫彩_初始化, 引數填true是啟用D2D硬體加速, 效果更好. 但xp系統不支援d2d, 這時候你就得填false來關閉d2d了
a := app.New(true)
// 建立普通視窗, 寬300, 高200, 標題是"xcgui window", xcc.Window_Style_Default是使用預設視窗風格
w := window.New(0, 0, 300, 200, "xcgui window", 0, xcc.Window_Style_Default)
// 顯示視窗
w.Show(true)
// 執行訊息迴圈, 程式會被阻塞在這裡不退出, 當炫彩視窗數量為0時退出
a.Run()
// 退出介面庫釋放資源
a.Exit()
}
五、編譯程式
go build -ldflags="-s -w -H windowsgui"
引數解釋:-H windowsgui
會隱藏黑視窗,-s -w
去除了符號表和除錯資訊,這樣可以減小軟體體積。
六、介面效果
直接編譯後大小為1.61M,使用upx64位壓縮後大小變為386K
七、把dll編譯程式序裡,執行時寫出
先把xcgui.dll放到專案目錄裡,然後看下面程式碼:
package main
import (
_ "embed"
"os"
"github.com/twgh/xcgui/app"
"github.com/twgh/xcgui/window"
"github.com/twgh/xcgui/xcc"
)
//go:embed XCGUI.dll
var dll []byte
func main() {
os.WriteFile("xcgui.dll", dll, 0666)
// 炫彩_初始化, 引數填true是啟用D2D硬體加速, 效果更好. 但xp系統不支援d2d, 這時候你就得填false來關閉d2d了
a := app.New(true)
// 建立普通視窗, 寬300, 高200, 標題是"xcgui window", xcc.Window_Style_Default是使用預設視窗風格
w := window.New(0, 0, 300, 200, "xcgui window", 0, xcc.Window_Style_Default)
// 顯示視窗
w.Show(true)
// 執行訊息迴圈, 程式會被阻塞在這裡不退出, 當炫彩視窗數量為0時退出
a.Run()
// 退出介面庫釋放資源
a.Exit()
}
八、如果不想讓使用者看到執行目錄有個dll檔案,可以把dll釋放到系統臨時目錄裡
這樣使用者就感覺不到dll的存在了,和一個二進位制檔案也沒啥太大區別。
package main
import (
_ "embed"
"github.com/twgh/xcgui/app"
"github.com/twgh/xcgui/window"
"github.com/twgh/xcgui/xc"
"github.com/twgh/xcgui/xcc"
)
//go:embed XCGUI.dll
var dll []byte
func main() {
// 把 xcgui.dll 寫出到windows臨時目錄
err := xc.WriteDll(dll)
if err != nil {
panic(err)
}
// 炫彩_初始化, 引數填true是啟用D2D硬體加速, 效果更好. 但xp系統不支援d2d, 這時候你就得填false來關閉d2d了
a := app.New(true)
// 建立普通視窗, 寬300, 高200, 標題是"xcgui window", xcc.Window_Style_Default是使用預設視窗風格
w := window.New(0, 0, 300, 200, "xcgui window", 0, xcc.Window_Style_Default)
// 顯示視窗
w.Show(true)
// 執行訊息迴圈, 程式會被阻塞在這裡不退出, 當炫彩視窗數量為0時退出
a.Run()
// 退出介面庫釋放資源
a.Exit()
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結