Added the code for the subclassing. And it smashes the stack. Wonderful...
This commit is contained in:
parent
51a3c0e379
commit
257fd8f07c
|
@ -102,8 +102,8 @@ func f_RemoveWindowSubclass(hwnd uintptr, subproc uintptr, id t_UINT_PTR) (uintp
|
||||||
return r1, err
|
return r1, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func f_DefSubclassProc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM, id t_UINT_PTR, data t_DWORD_PTR) t_LRESULT {
|
func f_DefSubclassProc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM) t_LRESULT {
|
||||||
r1, _, _ := fv_DefSubclassProc.Call(hwnd, uintptr(uMsg), uintptr(wParam), uintptr(lParam), uintptr(id), uintptr(data))
|
r1, _, _ := fv_DefSubclassProc.Call(hwnd, uintptr(uMsg), uintptr(wParam), uintptr(lParam))
|
||||||
return t_LRESULT(r1)
|
return t_LRESULT(r1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,10 +100,15 @@ func newButton(text string) *Request {
|
||||||
c_BS_PUSHBUTTON | c_WS_TABSTOP,
|
c_BS_PUSHBUTTON | c_WS_TABSTOP,
|
||||||
0)
|
0)
|
||||||
setWindowText(w.hwnd, text, []t_LRESULT{c_FALSE})
|
setWindowText(w.hwnd, text, []t_LRESULT{c_FALSE})
|
||||||
c <- &button{
|
b := &button{
|
||||||
widgetbase: w,
|
widgetbase: w,
|
||||||
clicked: newEvent(),
|
clicked: newEvent(),
|
||||||
}
|
}
|
||||||
|
res, err := f_SetWindowSubclass(w.hwnd, buttonsubprocptr, 0, t_DWORD_PTR(uintptr(unsafe.Pointer(b))))
|
||||||
|
if res == c_FALSE {
|
||||||
|
panic(fmt.Errorf("error subclassing Button to give it its own event handler: %v", err))
|
||||||
|
}
|
||||||
|
c <- b
|
||||||
},
|
},
|
||||||
resp: c,
|
resp: c,
|
||||||
}
|
}
|
||||||
|
@ -128,7 +133,12 @@ func (b *button) SetText(text string) *Request {
|
||||||
return b.settext(text)
|
return b.settext(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
var buttonsubprocptr = syscall.NewCallback(buttonSubProc)
|
var buttonsubprocptr uintptr
|
||||||
|
|
||||||
|
// to avoid recursive initialization loop
|
||||||
|
func init() {
|
||||||
|
buttonsubprocptr = syscall.NewCallback(buttonSubProc)
|
||||||
|
}
|
||||||
|
|
||||||
func buttonSubProc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM, id t_UINT_PTR, data t_DWORD_PTR) t_LRESULT {
|
func buttonSubProc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM, id t_UINT_PTR, data t_DWORD_PTR) t_LRESULT {
|
||||||
b := (*button)(unsafe.Pointer(uintptr(data)))
|
b := (*button)(unsafe.Pointer(uintptr(data)))
|
||||||
|
@ -139,12 +149,15 @@ func buttonSubProc(hwnd uintptr, uMsg t_UINT, wParam t_WPARAM, lParam t_LPARAM,
|
||||||
println("button clicked")
|
println("button clicked")
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
// TODO return
|
return f_DefSubclassProc(hwnd, uMsg, wParam, lParam)
|
||||||
case c_WM_NCDESTROY:
|
case c_WM_NCDESTROY:
|
||||||
// TODO remove
|
res, err := f_RemoveWindowSubclass(b.hwnd, buttonsubprocptr, id)
|
||||||
// TODO return
|
if res == c_FALSE {
|
||||||
|
panic(fmt.Errorf("error removing Button subclass (which was for its own event handler): %v", err))
|
||||||
|
}
|
||||||
|
return f_DefSubclassProc(hwnd, uMsg, wParam, lParam)
|
||||||
default:
|
default:
|
||||||
// TODO return
|
return f_DefSubclassProc(hwnd, uMsg, wParam, lParam)
|
||||||
}
|
}
|
||||||
panic(fmt.Errorf("Button message %d does not return a value (bug in buttonSubProc())", uMsg))
|
panic(fmt.Errorf("Button message %d does not return a value (bug in buttonSubProc())", uMsg))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue