FORGE KUI / learn

用 Go 打开原生窗口

运行包内程序,再读加载、资源释放和 UI 线程的代码。

版本 3.61.7

第13课
准备
Windows x64、Go SDK、Go、Python 与 LLVM Clang
学完可以做
修改并构建 Go 桌面窗口
申请获取 SDK →Go SDK · Windows x64

运行包内窗口

从 Go SDK 根目录运行预编译程序。它从 EXE 同目录加载 kui_c.dll,打开一个原生窗口;这一环节不需要编译。

powershell
.\bin\kui_go_hello_world.exe

读入口代码

hello_world 先 Load、Init,再创建 Window 与 Document。Load 失败时程序直接报错;拥有型对象用 defer Close 释放。Run 进入 UI 消息循环。

go
package main

import (
	"log"

	kui "github.com/kui-engine/kui-go/v3"
	"github.com/kui-engine/kui-go/v3/examples/internal/exampleutil"
)

func main() {
	if err := kui.Load(exampleutil.RuntimePath()); err != nil {
		log.Fatal(err)
	}
	if err := kui.Init(); err != nil {
		log.Fatal(err)
	}
	defer kui.Shutdown()

	window, err := kui.NewWindow(kui.WindowProps{Title: "KUI Go SDK", Width: 960, Height: 640, Centered: true})
	if err != nil {
		log.Fatal(err)
	}
	defer window.Close()
	document, err := window.Document()
	if err != nil {
		log.Fatal(err)
	}
	defer document.Close()
	if err := document.LoadHTML(`<main style="padding:48px;font-family:sans-serif"><h1>Go SDK 已接入 KUI</h1><p>此程序仅通过公开 C ABI 工作。</p></main>`); err != nil {
		log.Fatal(err)
	}
	if err := window.Show(); err != nil {
		log.Fatal(err)
	}
	if _, err := kui.Run(); err != nil {
		log.Fatal(err)
	}
}

修改并构建单个示例

在 examples/hello_world/main.go 修改 HTML 的标题。在 SDK 根目录执行下列命令;输出放到 bin,方便它找到同目录的 kui_c.dll。CC 适配器处理 MSVC 目标的 Clang 参数。

powershell
$python = (Get-Command python).Source
$adapter = (Resolve-Path .\tools\clang_go_cgo.py).Path
$env:CGO_ENABLED = '1'
$env:CC = "`"$python`" `"$adapter`""
go build -o .\bin\my_first_go.exe .\examples\hello_world
.\bin\my_first_go.exe

验收与排错

确认窗口显示新标题。若提示找不到 kui_c.dll,检查 bin 目录或把运行库路径显式传为程序第一个参数;若编译失败,核对 Go、Python 和 LLVM Clang 是否可调用。

powershell
.\bin\my_first_go.exe .\native\bin\kui_c.dll

文档有误或遗漏?

反馈此页问题 →