summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basicctrls_windows.c3
-rw-r--r--comctl32_windows.c1
-rw-r--r--spinbox_windows.go62
-rw-r--r--winapi_windows.h1
4 files changed, 67 insertions, 0 deletions
diff --git a/basicctrls_windows.c b/basicctrls_windows.c
index 8a4cc9a..1041b32 100644
--- a/basicctrls_windows.c
+++ b/basicctrls_windows.c
@@ -160,3 +160,6 @@ void setGroupSubclass(HWND hwnd, void *data)
if ((*fv_SetWindowSubclass)(hwnd, groupSubProc, 0, (DWORD_PTR) data) == FALSE)
xpanic("error subclassing Group to give it its own event handler", GetLastError());
}
+
+// provided for cgo's benefit
+LPWSTR xUPDOWN_CLASSW = UPDOWN_CLASSW;
diff --git a/comctl32_windows.c b/comctl32_windows.c
index 841aa80..d9d96a9 100644
--- a/comctl32_windows.c
+++ b/comctl32_windows.c
@@ -17,6 +17,7 @@ BOOL (*WINAPI fv_ImageList_Destroy)(HIMAGELIST);
ICC_PROGRESS_CLASS | /* progress bars */ \
ICC_TAB_CLASSES | /* tabs */ \
ICC_LISTVIEW_CLASSES | /* list views */ \
+ ICC_UPDOWN_CLASS | /* spinboxes */ \
0)
// note that this is an 8-bit character string we're writing; see the encoding clause
diff --git a/spinbox_windows.go b/spinbox_windows.go
new file mode 100644
index 0000000..6d6cb5e
--- /dev/null
+++ b/spinbox_windows.go
@@ -0,0 +1,62 @@
+// 28 october 2014
+
+package ui
+
+import (
+ "unsafe"
+)
+
+// #include "winapi_windows.h"
+import "C"
+
+// TODO do we have to manually monitor user changes to the edit control?
+
+type spinbox struct {
+ hwndEdit C.HWND
+ hwndUpDown C.HWND
+}
+
+func newSpinbox() Spinbox {
+ s := new(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)
+ return s
+}
+
+func (s *spinbox) setParent(p *controlParent) {
+ C.controlSetParent(s.hwndEdit, p.hwnd)
+ C.controlSetParent(s.hwndUpDown, p.hwnd)
+}
+
+func (s *spinbox) preferredSize(d *sizing) (width, height int) {
+ // TODO
+ return 20, 20
+}
+
+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))
+}
+
+func (s *spinbox) nTabStops() int {
+ // TODO does the up-down control count?
+ return 1
+}
+
+// TODO be sure to modify this when we add Show()/Hide()
+func (s *spinbox) containerShow() {
+ C.ShowWindow(s.hwndEdit, C.SW_SHOW)
+ C.ShowWindow(s.hwndUpDown, C.SW_SHOW)
+}
+
+// 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)
+}
diff --git a/winapi_windows.h b/winapi_windows.h
index f1a22a1..48b0a54 100644
--- a/winapi_windows.h
+++ b/winapi_windows.h
@@ -75,6 +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;
// init_windows.c
extern HINSTANCE hInstance;