golang Windows应用程序开发工具包插件库walk的使用

Golang Windows应用程序开发工具包插件库walk的使用

关于Walk

Walk是一个用于Go编程语言的"Windows应用程序库工具包"。它主要用于桌面GUI开发,但也包含其他功能。

安装

确保您有一个正常工作的Go环境。Walk目前需要Go 1.11.x或更高版本。

安装命令:

go get github.com/lxn/walk

使用Walk

使用Walk创建GUI的首选方式是使用其声明式子包,如下面这个小例子所示:

test.go示例代码

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
	"strings"
)

func main() {
	var inTE, outTE *walk.TextEdit

	MainWindow{
		Title:   "SCREAMO",
		MinSize: Size{600, 400},
		Layout:  VBox{},
		Children: []Widget{
			HSplitter{
				Children: []Widget{
					TextEdit{AssignTo: &inTE},
					TextEdit{AssignTo: &outTE, ReadOnly: true},
				},
			},
			PushButton{
				Text: "SCREAM",
				OnClicked: func() {
					outTE.SetText(strings.ToUpper(inTE.Text()))
				},
			},
		},
	}.Run()
}

创建清单文件test.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="SomeFunkyNameHere" type="win32"/>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
        </dependentAssembly>
    </dependency>
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
        </windowsSettings>
    </application>
</assembly>

然后使用rsrc工具编译清单文件:

go get github.com/akavel/rsrc
rsrc -manifest test.manifest -o rsrc.syso

或者将test.manifest文件重命名为test.exe.manifest并与应用程序一起分发。

构建应用程序

在包含test.go的目录中运行:

go build

要消除cmd窗口,可以运行:

go build -ldflags="-H windowsgui"

运行应用程序

test.exe

示例输出(Windows 7)

示例输出

更多示例

有一些示例可以帮助您入门。

应用程序清单文件

Walk需要Common Controls 6。这意味着您必须将适当的应用程序清单文件放在可执行文件旁边或作为资源嵌入。

您可以复制示例附带的应用程序清单文件之一。

要将清单文件作为资源嵌入,可以使用rsrc工具。

重要提示:如果不将清单作为资源嵌入,则不应在清单文件就位之前启动可执行文件。如果这样做,程序将无法正常运行。更糟糕的是,Windows将无法识别您稍后放在可执行文件旁边的清单文件。要解决此问题,请重新构建可执行文件,并仅在清单文件就位时启动它。

CGo优化

通常的默认消息循环包括对win32 API函数的调用,这会带来相当多的运行时开销。作为替代方案,您可以通过传递walk_use_cgo构建标记来编译使用主消息循环的可选C实现的Walk:

go build -tags walk_use_cgo

更多关于golang Windows应用程序开发工具包插件库walk的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang Windows应用程序开发工具包插件库walk的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang Windows应用程序開發工具包walk使用指南

walk是一個用於Go語言開發Windows桌面應用程序的庫,它提供了豐富的Windows GUI控件和功能。以下是walk的主要特點和使用方法。

walk的主要特點

  1. 原生Windows控件支持
  2. 簡單易用的API設計
  3. 支持數據綁定
  4. 提供對話框、菜單、工具欄等常見UI元素
  5. 支持高DPI顯示

安裝walk

go get github.com/lxn/walk

基本使用示例

1. 創建簡單窗口

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

func main() {
	var mainWindow *walk.MainWindow
	
	MainWindow{
		Title:   "Walk示例程序",
		MinSize: Size{300, 200},
		Layout:  VBox{},
		Children: []Widget{
			PushButton{
				Text: "點擊我",
				OnClicked: func() {
					walk.MsgBox(mainWindow, "提示", "你點擊了按鈕!", walk.MsgBoxIconInformation)
				},
			},
		},
	}.Create(&mainWindow)
	
	mainWindow.Run()
}

2. 使用更多控件

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

func main() {
	var mainWindow *walk.MainWindow
	var nameEdit *walk.LineEdit
	var greetBtn *walk.PushButton
	
	MainWindow{
		Title:   "Walk控件示例",
		MinSize: Size{400, 300},
		Layout:  VBox{},
		Children: []Widget{
			Label{
				Text: "請輸入你的名字:",
			},
			LineEdit{
				AssignTo: &nameEdit,
			},
			PushButton{
				AssignTo: &greetBtn,
				Text:     "問候",
				OnClicked: func() {
					name := nameEdit.Text()
					if name == "" {
						name = "陌生人"
					}
					walk.MsgBox(mainWindow, "問候", "你好, "+name+"!", walk.MsgBoxIconInformation)
				},
			},
			CheckBox{
				Text:    "啟用問候按鈕",
				Checked: true,
				OnCheckedChanged: func() {
					greetBtn.SetEnabled(!greetBtn.Enabled())
				},
			},
			RadioButtonGroup{
				DataMember: "Options",
				Buttons: []RadioButton{
					{Text: "選項1"},
					{Text: "選項2"},
					{Text: "選項3"},
				},
			},
		},
	}.Create(&mainWindow)
	
	mainWindow.Run()
}

3. 使用數據綁定

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

type Person struct {
	Name   string
	Age    int
	Active bool
}

func main() {
	var mainWindow *walk.MainWindow
	var nameEdit *walk.LineEdit
	var ageEdit *walk.NumberEdit
	var activeCheck *walk.CheckBox
	
	person := &Person{
		Name:   "張三",
		Age:    30,
		Active: true,
	}
	
	MainWindow{
		Title:   "數據綁定示例",
		MinSize: Size{400, 300},
		Layout:  VBox{},
		Children: []Widget{
			Label{Text: "姓名:"},
			LineEdit{
				AssignTo: &nameEdit,
				Text:     Bind("Name"),
			},
			Label{Text: "年齡:"},
			NumberEdit{
				AssignTo: &ageEdit,
				Value:    Bind("Age"),
			},
			CheckBox{
				AssignTo: &activeCheck,
				Text:     "活躍",
				Checked:  Bind("Active"),
			},
			PushButton{
				Text: "顯示數據",
				OnClicked: func() {
					walk.MsgBox(mainWindow, "當前數據", 
						"姓名: "+person.Name+"\n"+
						"年齡: "+string(person.Age)+"\n"+
						"活躍: "+string(person.Active), 
						walk.MsgBoxIconInformation)
				},
			},
		},
		DataBinder: DataBinder{
			DataSource: person,
		},
	}.Create(&mainWindow)
	
	mainWindow.Run()
}

4. 使用對話框

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

func main() {
	var mainWindow *walk.MainWindow
	
	MainWindow{
		Title:   "對話框示例",
		MinSize: Size{300, 200},
		Layout:  VBox{},
		Children: []Widget{
			PushButton{
				Text: "打開文件",
				OnClicked: func() {
					dlg := new(walk.FileDialog)
					dlg.Title = "選擇文件"
					dlg.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*"
					
					if ok, err := dlg.ShowOpen(mainWindow); err != nil {
						walk.MsgBox(mainWindow, "錯誤", err.Error(), walk.MsgBoxIconError)
					} else if ok {
						walk.MsgBox(mainWindow, "選擇的文件", dlg.FilePath, walk.MsgBoxIconInformation)
					}
				},
			},
			PushButton{
				Text: "顏色選擇",
				OnClicked: func() {
					dlg := new(walk.ColorDialog)
					
					if ok, err := dlg.Show(mainWindow); err != nil {
						walk.MsgBox(mainWindow, "錯誤", err.Error(), walk.MsgBoxIconError)
					} else if ok {
						walk.MsgBox(mainWindow, "選擇的顏色", dlg.Color().String(), walk.MsgBoxIconInformation)
					}
				},
			},
		},
	}.Create(&mainWindow)
	
	mainWindow.Run()
}

進階功能

自定義控件

package main

import (
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"
)

type MyWidget struct {
	*walk.CustomWidget
}

func NewMyWidget(parent walk.Container) (*MyWidget, error) {
	w := new(MyWidget)
	
	if err := (CustomWidget{
		AssignTo: &w.CustomWidget,
		Name:     "myWidget",
		Paint:    w.drawWidget,
	}).Create(parent); err != nil {
		return nil, err
	}
	
	return w, nil
}

func (w *MyWidget) drawWidget(canvas *walk.Canvas, updateBounds walk.Rectangle) error {
	brush, _ := walk.NewSolidColorBrush(walk.RGB(255, 0, 0))
	defer brush.Dispose()
	
	canvas.FillRectangle(brush, w.ClientBounds())
	
	return nil
}

func main() {
	var mainWindow *walk.MainWindow
	
	MainWindow{
		Title:   "自定義控件示例",
		MinSize: Size{300, 200},
		Layout:  VBox{},
		Children: []Widget{
			Composite{
				Layout: VBox{},
				Children: []Widget{
					CustomWidget{
						Paint: func(canvas *walk.Canvas, updateBounds walk.Rectangle) error {
							brush, _ := walk.NewSolidColorBrush(walk.RGB(0, 0, 255))
							defer brush.Dispose()
							
							canvas.FillRectangle(brush, updateBounds)
							return nil
						},
						MinSize: Size{100, 100},
					},
				},
			},
		},
	}.Create(&mainWindow)
	
	mainWindow.Run()
}

walk庫提供了豐富的功能來開發Windows桌面應用程序,以上只是基礎示例。更多高級功能可以參考walk的官方文檔和示例代碼。

回到顶部