// 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, setting the parent properly, and subclassing are handled here s.hwndUpDown = C.newUpDown(s.hwndUpDown, unsafe.Pointer(s)) // 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, C.WPARAM(s.min), C.LPARAM(s.max)) C.SendMessageW(s.hwndUpDown, C.UDM_SETPOS32, 0, C.LPARAM(s.value)) if s.updownVisible { C.ShowWindow(s.hwndUpDown, C.SW_SHOW) } }
func finishNewTable(b *tablebase, ty reflect.Type) Table { hwnd := C.newControl(C.xtableWindowClass, C.WS_HSCROLL|C.WS_VSCROLL|C.WS_TABSTOP, C.WS_EX_CLIENTEDGE) // WS_EX_CLIENTEDGE without WS_BORDER will show the canonical visual styles border (thanks to MindChild in irc.efnet.net/#winprog) t := &table{ controlSingleHWND: newControlSingleHWND(hwnd), tablebase: b, selected: newEvent(), free: make(map[C.uintptr_t]bool), } t.fpreferredSize = t.xpreferredSize t.chainresize = t.fresize t.fresize = t.xresize C.setTableSubclass(t.hwnd, unsafe.Pointer(t)) // TODO listview didn't need this; someone mentioned (TODO) it uses the small caption font??? C.controlSetControlFont(t.hwnd) for i := 0; i < ty.NumField(); i++ { coltype := C.WPARAM(C.tableColumnText) switch { case ty.Field(i).Type == reflect.TypeOf((*image.RGBA)(nil)): coltype = C.tableColumnImage case ty.Field(i).Type.Kind() == reflect.Bool: coltype = C.tableColumnCheckbox } colname := ty.Field(i).Tag.Get("uicolumn") if colname == "" { colname = ty.Field(i).Name } ccolname := toUTF16(colname) C.SendMessageW(t.hwnd, C.tableAddColumn, coltype, C.LPARAM(uintptr(unsafe.Pointer(ccolname)))) // TODO free ccolname } t.colcount = C.int(ty.NumField()) return t }
func (p *progressbar) SetPercent(percent int) { if percent < 0 || percent > 100 { panic(fmt.Errorf("given ProgressBar percentage %d out of range", percent)) } // TODO circumvent aero C.SendMessageW(p.hwnd, C.PBM_SETPOS, C.WPARAM(percent), 0) }
func getWindowText(hwnd C.HWND) string { // WM_GETTEXTLENGTH and WM_GETTEXT return the count /without/ the terminating null character // but WM_GETTEXT expects the buffer size handed to it to /include/ the terminating null character n := C.getWindowTextLen(hwnd) buf := make([]uint16, int(n+1)) C.getWindowText(hwnd, C.WPARAM(n), C.LPWSTR(unsafe.Pointer(&buf[0]))) return syscall.UTF16ToString(buf) }
func ProcND(hwnd win.HWND, msg uint, wParam uintptr, lParam uintptr) (ret int, handled bool) { var bHandled C.BOOL // ret = uintptr(syssciterProcND(HWND(hwnd), msg, wParam, lParam, &bHandled)) ret = int(C.SciterProcND(C.HWINDOW(unsafe.Pointer(hwnd)), C.UINT(msg), C.WPARAM(wParam), C.LPARAM(lParam), &bHandled)) if bHandled == 0 { handled = false } else { handled = true } return }
func (a *area) Repaint(r image.Rectangle) { var hscroll, vscroll C.int var rect C.RECT C.SendMessageW(a.hwnd, C.msgAreaGetScroll, C.WPARAM(uintptr(unsafe.Pointer(&hscroll))), C.LPARAM(uintptr(unsafe.Pointer(&vscroll)))) r = r.Add(image.Pt(int(hscroll), int(vscroll))) // adjust by scroll position r = image.Rect(0, 0, a.width, a.height).Intersect(r) if r.Empty() { return } rect.left = C.LONG(r.Min.X) rect.top = C.LONG(r.Min.Y) rect.right = C.LONG(r.Max.X) rect.bottom = C.LONG(r.Max.Y) C.SendMessageW(a.hwnd, C.msgAreaRepaint, 0, C.LPARAM(uintptr(unsafe.Pointer(&rect)))) }
// Main htmlayout wndproc func ProcNoDefault(hwnd, msg uint32, wparam, lparam uintptr) (uintptr, bool) { var handled C.BOOL = 0 var result C.LRESULT = C.HTMLayoutProcND(C.HWND(C.HANDLE(uintptr(hwnd))), C.UINT(msg), C.WPARAM(wparam), C.LPARAM(lparam), &handled) return uintptr(result), handled != 0 }