Fixed Windows Spinbox sizing for now.
This commit is contained in:
parent
cedb545e5c
commit
071ebcf5be
|
@ -161,5 +161,27 @@ void setGroupSubclass(HWND hwnd, void *data)
|
|||
xpanic("error subclassing Group to give it its own event handler", GetLastError());
|
||||
}
|
||||
|
||||
// provided for cgo's benefit
|
||||
LPWSTR xUPDOWN_CLASSW = UPDOWN_CLASSW;
|
||||
HWND newUpDown(HWND prevUpDown)
|
||||
{
|
||||
HWND hwnd;
|
||||
HWND parent;
|
||||
|
||||
parent = msgwin; // for the first up-down
|
||||
if (prevUpDown != NULL) {
|
||||
parent = GetParent(prevUpDown);
|
||||
if (parent == NULL)
|
||||
xpanic("error getting parent of old up-down in Spinbox resize for new up-down", GetLastError());
|
||||
if (DestroyWindow(prevUpDown) == 0)
|
||||
xpanic("error destroying previous up-down in Spinbox resize", GetLastError());
|
||||
}
|
||||
hwnd = CreateWindowExW(0,
|
||||
UPDOWN_CLASSW, L"",
|
||||
// no WS_VISIBLE; we set visibility ourselves
|
||||
WS_CHILD | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_HOTTRACK | UDS_NOTHOUSANDS | UDS_SETBUDDYINT,
|
||||
// this is important; it's necessary for autosizing to work
|
||||
0, 0, 0, 0,
|
||||
parent, NULL, hInstance, NULL);
|
||||
if (hwnd == NULL)
|
||||
xpanic("error creating up-down control for Spinbox", GetLastError());
|
||||
return hwnd;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,8 @@ import "C"
|
|||
type spinbox struct {
|
||||
hwndEdit C.HWND
|
||||
hwndUpDown C.HWND
|
||||
// updown state
|
||||
updownVisible bool
|
||||
}
|
||||
|
||||
func newSpinbox() Spinbox {
|
||||
|
@ -21,12 +23,8 @@ func newSpinbox() Spinbox {
|
|||
s.hwndEdit = C.newControl(editclass,
|
||||
C.textfieldStyle | C.ES_NUMBER,
|
||||
C.textfieldExtStyle)
|
||||
s.hwndUpDown = C.newControl(C.xUPDOWN_CLASSW,
|
||||
C.UDS_ALIGNRIGHT | C.UDS_ARROWKEYS | C.UDS_HOTTRACK | C.UDS_NOTHOUSANDS | C.UDS_SETBUDDYINT,
|
||||
0)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETBUDDY, C.WPARAM(uintptr(unsafe.Pointer(s.hwndEdit))), 0)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETRANGE32, 0, 100)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, 0)
|
||||
s.updownVisible = true // initially shown
|
||||
s.remakeUpDown()
|
||||
return s
|
||||
}
|
||||
|
||||
|
@ -35,6 +33,23 @@ func (s *spinbox) setParent(p *controlParent) {
|
|||
C.controlSetParent(s.hwndUpDown, p.hwnd)
|
||||
}
|
||||
|
||||
// an up-down control will only properly position itself the first time
|
||||
// stupidly, there are no messages to force a size calculation, nor can I seem to reset the buddy window to force a new position
|
||||
// alas, we have to make a new up/down control each time :(
|
||||
// TODO we'll need to store a copy of the current position and range for this
|
||||
func (s *spinbox) remakeUpDown() {
|
||||
// destroying the previous one and setting the parent properly is handled here
|
||||
s.hwndUpDown = C.newUpDown(s.hwndUpDown)
|
||||
// for this to work, hwndUpDown needs to have rect [0 0 0 0]
|
||||
C.moveWindow(s.hwndUpDown, 0, 0, 0, 0)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETBUDDY, C.WPARAM(uintptr(unsafe.Pointer(s.hwndEdit))), 0)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETRANGE32, 0, 100)
|
||||
C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, 0)
|
||||
if s.updownVisible {
|
||||
C.ShowWindow(s.hwndUpDown, C.SW_SHOW)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *spinbox) preferredSize(d *sizing) (width, height int) {
|
||||
// TODO
|
||||
return 20, 20
|
||||
|
@ -42,6 +57,7 @@ func (s *spinbox) preferredSize(d *sizing) (width, height int) {
|
|||
|
||||
func (s *spinbox) resize(x int, y int, width int, height int, d *sizing) {
|
||||
C.moveWindow(s.hwndEdit, C.int(x), C.int(y), C.int(width), C.int(height))
|
||||
s.remakeUpDown()
|
||||
}
|
||||
|
||||
func (s *spinbox) nTabStops() int {
|
||||
|
@ -53,10 +69,12 @@ func (s *spinbox) nTabStops() int {
|
|||
func (s *spinbox) containerShow() {
|
||||
C.ShowWindow(s.hwndEdit, C.SW_SHOW)
|
||||
C.ShowWindow(s.hwndUpDown, C.SW_SHOW)
|
||||
s.updownVisible = true
|
||||
}
|
||||
|
||||
// TODO be sure to modify this when we add Show()/Hide()
|
||||
func (s *spinbox) containerHide() {
|
||||
C.ShowWindow(s.hwndEdit, C.SW_HIDE)
|
||||
C.ShowWindow(s.hwndUpDown, C.SW_HIDE)
|
||||
s.updownVisible = false
|
||||
}
|
||||
|
|
|
@ -75,7 +75,7 @@ extern void setTextFieldSubclass(HWND, void *);
|
|||
extern void textfieldSetAndShowInvalidBalloonTip(HWND, WCHAR *);
|
||||
extern void textfieldHideInvalidBalloonTip(HWND);
|
||||
extern void setGroupSubclass(HWND, void *);
|
||||
extern LPWSTR xUPDOWN_CLASSW;
|
||||
extern HWND newUpDown(HWND);
|
||||
|
||||
// init_windows.c
|
||||
extern HINSTANCE hInstance;
|
||||
|
|
Loading…
Reference in New Issue