Open suoyukii opened 5 years ago
@lxn
package main
import (
"syscall"
"github.com/lxn/walk"
)
func GetSystemMetrics(nIndex int) int {
ret, _, _ := syscall.NewLazyDLL(`User32.dll`).NewProc(`GetSystemMetrics`).Call(uintptr(nIndex))
return int(ret)
}
func main() {
window, _ := walk.NewMainWindow()
window.SetWidth(400)
window.SetHeight(400)
window.SetX((GetSystemMetrics(0) - window.Width()) / 2)
window.SetY((GetSystemMetrics(1) - window.Height()) / 2)
window.Show()
window.Run()
}
Thanks for reporting. This should be fixed by https://github.com/lxn/walk/commit/a8335f0ed5c41e27807bb706c61583ecefdcd2a5.
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x20 pc=0x5acd10]
goroutine 1 [running, locked to thread]:
github.com/lxn/walk.CreateLayoutItemsForContainerWithContext(0x92fa60, 0xc00017e800, 0xc000045a90, 0x8062c, 0x0)
C:/Users/12526/go/src/github.com/lxn/walk/layout.go:65 +0x520
github.com/lxn/walk.CreateLayoutItemsForContainer(0x92fa60, 0xc00017e800, 0x0, 0x338)
C:/Users/12526/go/src/github.com/lxn/walk/layout.go:49 +0xbb
github.com/lxn/walk.(*FormBase).startLayout(0xc00017e800, 0x90624)
C:/Users/12526/go/src/github.com/lxn/walk/form.go:726 +0x11a
github.com/lxn/walk.(*FormBase).WndProc(0xc00017e800, 0x90624, 0x47, 0x0, 0x124fdd0, 0x0)
C:/Users/12526/go/src/github.com/lxn/walk/form.go:818 +0x7bc
github.com/lxn/walk.(*MainWindow).WndProc(0xc00017e800, 0x90624, 0x47, 0x0, 0x124fdd0, 0x28)
C:/Users/12526/go/src/github.com/lxn/walk/mainwindow.go:233 +0x76
github.com/lxn/walk.defaultWndProc(0x90624, 0x47, 0x0, 0x124fdd0, 0x0)
C:/Users/12526/go/src/github.com/lxn/walk/window.go:1989 +0xd7
syscall.Syscall(0x7fff26ee3d60, 0x2, 0x90624, 0x8, 0x0, 0x0, 0x0, 0x0)
c:/go/src/runtime/syscall_windows.go:184 +0xea
github.com/lxn/win.ShowWindow(0x90624, 0x8, 0x8062c)
C:/Users/12526/go/src/github.com/lxn/win/user32.go:3186 +0x6a
github.com/lxn/walk.setWindowVisible(...)
C:/Users/12526/go/src/github.com/lxn/walk/window.go:1249
github.com/lxn/walk.(*WindowBase).SetVisible(0xc00017e800, 0x12a6101)
C:/Users/12526/go/src/github.com/lxn/walk/window.go:1213 +0x72
github.com/lxn/walk.(*MainWindow).SetVisible(0xc00017e800, 0x92d001)
C:/Users/12526/go/src/github.com/lxn/walk/mainwindow.go:141 +0x41
github.com/lxn/walk.(*FormBase).Show(0xc00017e800)
C:/Users/12526/go/src/github.com/lxn/walk/form.go:603 +0xde
Set the width and height of the window to be behind the Show() so that errors will not be reported.
window.SetLayout(walk.NewGridLayout())
// Set window position
window.SetX((sys_width - window_width) / 2)
window.SetY((sys_height - window_height) / 2)
// Maximum height of container
max_y := len(btn_list) / max_x
if len(btn_list)%max_x != 0 {
max_y += 1
}
// Add button
for _, val := range btn_list {
HD_Button(val)
}
// Window size change event
window.SizeChanged().Attach(func() {
btn_len := window.Children().Len()
i := 0
btn_w := window.ClientBounds().Width / max_x
btn_h := window.ClientBounds().Height / max_y
x := 0
y := -btn_h
rect := walk.Rectangle{X: x, Y: y, Width: btn_w, Height: btn_h}
for ; i < btn_len; i++ {
if i%max_x == 0 {
rect.X = 0
rect.Y += btn_h
}
window.Children().At(i).SetBounds(rect)
rect.X += btn_w
}
})
// Display window
window.Show()
// Set width and height
window.SetWidth(window_width)
window.SetHeight(window_height)
What if I prefer to use my own Layout? I don't really want to use the layout set up by the system.
Not sure if this is still possible. You may have to implement walk.Layout
and walk.ContainerLayoutItem
. Or wait until I restore support for custom layouts.