How to add List Column to ListView?
Closed this issue · 2 comments
Demo:
func NewMyWindow() *MyWindow {
wnd := ui.NewWindowMain(
ui.WindowMainOpts().
Title("Title").
ClientArea(win.SIZE{Cx: 340, Cy: 500}),
)
icx := win.INITCOMMONCONTROLSEX{
DwICC: co.ICC_LISTVIEW_CLASSES,
}
icx.SetDwSize()
win.InitCommonControlsEx(&icx)
me := &MyWindow{
wnd: wnd,
lblName: ui.NewStatic(wnd,
ui.StaticOpts().
Text("YourName").
Position(win.POINT{X: 10, Y: 22}),
),
txtName: ui.NewEdit(wnd,
ui.EditOpts().
Position(win.POINT{X: 80, Y: 20}).
Size(win.SIZE{Cx: 150}),
),
btnShow: ui.NewButton(wnd,
ui.ButtonOpts().
Text("&Show").
Position(win.POINT{X: 240, Y: 19}),
),
**table: ui.NewListView(wnd, ui.ListViewOpts().
Position(win.POINT{
X: 10,
Y: 50,
}).Size(win.SIZE{Cx: 400, Cy: 200}).
CtrlStyles(co.LVS_REPORT).WndStyles(co.WS_CHILD|co.WS_VISIBLE))**,
}
me.btnShow.On().BnClicked(func() {
msg := fmt.Sprintf("Hello, %s!", me.txtName.Text())
print(me.wnd.Hwnd().MessageBox(msg, "Saying hello", co.MB_OKCANCEL|co.MB_ICONINFORMATION))
})
**dwStyle := me.table.ExtendedStyle()
dwStyle |= co.LVS_EX_FULLROWSELECT
dwStyle |= co.LVS_EX_GRIDLINES
me.table.SetExtendedStyle(true, dwStyle)
me.table.Columns().Add([]int{20, 5}, "1", "2")
me.table.Columns().Add([]int{1}, "aaa")**
return me
I'm using ListView.Add().Columns() but nothing shown:(
And if call me.table.Items().Add("value1", "value2")
A panic occured :panic: LVM_SETITEMTEXT col 1, "value2" failed.
It panics because the listview doesn't exist yet. Windows will tell you when the controls are ready by sending you a WM_INITDIALOG
message, which is when you have your controls.
Since this is a very basic mistake, I suggest you to learn the basics of Win32 API first.
I just learned the Window Procedure and has made list view worked without panic.
Here is a workaround that might help other users who don't know much about the Win32 API:
- Register a Notify handler after Window created
notify := myWindow.wnd.On()
make sure that DO PUT IT before RunAsMain(), since RunAsMain will block.
- Accpet WM_CREATE
notify.WmCreate(func(p wm.Create) int {
// DO WHAT YOU WANT
dwStyle := myWindow.table.ExtendedStyle()
dwStyle |= co.LVS_EX_FULLROWSELECT
dwStyle |= co.LVS_EX_GRIDLINES
myWindow.table.SetExtendedStyle(true, dwStyle)
myWindow.table.Columns().Add([]int{80, 70, 120}, "Col 1", "Col 2", "Col 3")
return 0
})
I think I will contribute some basic docs pr to the project once I figure out some things, this is a promising project if someone sticked to windows classic gui programming (I am working on embbed devices testing tools development, and I don't need Qt or Fyne, they areunnecessary).