Go言語 - WALKでGUI - 部品を並べる
とりあえずPushButtonを並べてみる。
縦に並べる
MainWindowのLayoutフィールドにVBoxを指定して、Childrenフィールドの[]Widgetに部品を入れていく。
ちなみにLayoutをHBoxにすると横に並びます。
package main import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) import ( "fmt" "os" ) type MyMainWindow struct { *walk.MainWindow } func main() { mw := &MyMainWindow {} MW := MainWindow{ AssignTo: &mw.MainWindow, Title: "メインウィンドウ", MinSize: Size {150, 200}, Size : Size {300, 400}, Layout: VBox {}, Children: []Widget { PushButton { Text: "PB0", }, PushButton { Text: "PB1", }, PushButton { Text: "PB2", }, }, } if _, err := MW.Run(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
各段内で横に並べる
2段目と3段目にPushButtonの代わりにHSplitterを置いて、その中に部品を置いていくことで横方向に並んで行きます。2段目は水平方向に3分割して中央にHSpacerを置いて空白を作っています。
2つのHSplitterのStretchFactorフィールドを設定すると高さの割合?が調整できるようです。
HSplitterの中だとボタンはエリア一杯に広がる様です。(左図) 広がらないようにするにはHSplitterの代わりにComposite{ Layout:HBox{} }とします。(右図)
HSplitter{
StretchFactor: 20,
……
}
Composite{
Layout: HBox{},
……
}
package main import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) import ( "fmt" "os" ) type MyMainWindow struct { *walk.MainWindow } func main() { mw := &MyMainWindow {} MW := MainWindow{ AssignTo: &mw.MainWindow, Title: "メインウィンドウ", MinSize: Size {150, 200}, Size : Size {300, 400}, Layout: VBox {}, Children: []Widget { PushButton { Text: "PB0", }, HSplitter{ StretchFactor: 20, Children: []Widget { PushButton { // Splitter中のボタン面積は Text: "PB1", // エリア全体に広がる }, HSpacer{}, PushButton { Text: "PB2", }, }, }, HSplitter{ StretchFactor: 1, Children: []Widget { PushButton { Text: "PB3", }, PushButton { Text: "PB4", }, }, }, PushButton { Text: "PB5", }, }, } if _, err := MW.Run(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
縦横に並べる
縦横に部品を置く場合は、LayoutフィールドにGrid{Colmuns: n}として、Colmunsフィールドで列数を指定します。段数はChildrenフィールドに入れる部品の数で決まります。ただしGridはMainWindowのLayoutフィールドには置けないようなので、Compositeを一段入れてから使用する必要があるみたい。
PB1はColmunSpanフィールドに2を設定することで2列分の幅にしています。RowSpanフィールドも試しましたが現状では機能していない様です。
package main import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) import ( "fmt" "os" ) type MyMainWindow struct { *walk.MainWindow } func main() { mw := &MyMainWindow {} MW := MainWindow{ AssignTo: &mw.MainWindow, Title: "メインウィンドウ", MinSize: Size {150, 200}, Size : Size {300, 400}, Layout: VBox{}, Children: []Widget { Composite{ Layout: Grid {Columns : 3}, // GridはCompositeの中のみ可。 Children: []Widget { PushButton { Text: "PB0", }, PushButton { ColumnSpan : 2, Text: "PB1", }, // PushButton { // RowSpan : 2, // 機能しない? // Text: "PB2", // }, PushButton { Text: "PB3", }, VSplitter{ Children: []Widget { PushButton { Text: "PB4", }, VSpacer{}, }, }, VSplitter{ Children: []Widget { VSpacer {}, PushButton { Text: "PB5", }, }, }, }, }, PushButton { Text: "PB6", }, }, } if _, err := MW.Run(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }