diff options
| author | Pietro Gagliardi <[email protected]> | 2014-10-28 15:46:13 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-10-28 15:46:13 -0400 |
| commit | 667745dd8c79ea358b66456ea7afcc751429da88 (patch) | |
| tree | 7fd057c74e34a50282221cf0699569b00e90dc97 | |
| parent | 649b52b6ef273c2ea5a4cf881835a7fd61bd4df1 (diff) | |
Added the initial Windows Spinbox code.
| -rw-r--r-- | basicctrls_windows.c | 3 | ||||
| -rw-r--r-- | comctl32_windows.c | 1 | ||||
| -rw-r--r-- | spinbox_windows.go | 62 | ||||
| -rw-r--r-- | winapi_windows.h | 1 |
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; |
