func comboBoxEditWndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { cb := (*ComboBox)(unsafe.Pointer(win.GetWindowLongPtr(hwnd, win.GWLP_USERDATA))) switch msg { case win.WM_GETDLGCODE: if form := ancestor(cb); form != nil { if dlg, ok := form.(dialogish); ok { if dlg.DefaultButton() != nil { // If the ComboBox lives in a Dialog that has a // DefaultButton, we won't swallow the return key. break } } } if wParam == win.VK_RETURN { return win.DLGC_WANTALLKEYS } case win.WM_KEYDOWN: if wParam != win.VK_RETURN || 0 == cb.SendMessage(win.CB_GETDROPPEDSTATE, 0, 0) { cb.handleKeyDown(wParam, lParam) } case win.WM_KEYUP: if wParam != win.VK_RETURN || 0 == cb.SendMessage(win.CB_GETDROPPEDSTATE, 0, 0) { cb.handleKeyUp(wParam, lParam) } } return win.CallWindowProc(cb.editOrigWndProcPtr, hwnd, msg, wParam, lParam) }
// WndProc is the window procedure of the window. // // When implementing your own WndProc to add or modify behavior, call the // WndProc of the embedded window for messages you don't handle yourself. func (wb *WindowBase) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_ERASEBKGND: if wb.background == nil { break } canvas, err := newCanvasFromHDC(win.HDC(wParam)) if err != nil { break } defer canvas.Dispose() if err := canvas.FillRectangle(wb.background, wb.ClientBounds()); err != nil { break } return 1 case win.WM_LBUTTONDOWN, win.WM_MBUTTONDOWN, win.WM_RBUTTONDOWN: if msg == win.WM_LBUTTONDOWN && wb.origWndProcPtr == 0 { // Only call SetCapture if this is no subclassed control. // (Otherwise e.g. WM_COMMAND(BN_CLICKED) would no longer // be generated for PushButton.) win.SetCapture(wb.hWnd) } wb.publishMouseEvent(&wb.mouseDownPublisher, wParam, lParam) case win.WM_LBUTTONUP, win.WM_MBUTTONUP, win.WM_RBUTTONUP: if msg == win.WM_LBUTTONUP && wb.origWndProcPtr == 0 { // See WM_LBUTTONDOWN for why we require origWndProcPtr == 0 here. if !win.ReleaseCapture() { lastError("ReleaseCapture") } } wb.publishMouseEvent(&wb.mouseUpPublisher, wParam, lParam) case win.WM_MOUSEMOVE: wb.publishMouseEvent(&wb.mouseMovePublisher, wParam, lParam) case win.WM_SETCURSOR: if wb.cursor != nil { win.SetCursor(wb.cursor.handle()) return 0 } case win.WM_CONTEXTMENU: sourceWindow := windowFromHandle(win.HWND(wParam)) if sourceWindow == nil { break } x := win.GET_X_LPARAM(lParam) y := win.GET_Y_LPARAM(lParam) contextMenu := sourceWindow.ContextMenu() var handle win.HWND if widget, ok := sourceWindow.(Widget); ok { handle = ancestor(widget).Handle() } else { handle = sourceWindow.Handle() } if contextMenu != nil { win.TrackPopupMenuEx( contextMenu.hMenu, win.TPM_NOANIMATION, x, y, handle, nil) return 0 } case win.WM_KEYDOWN: wb.handleKeyDown(wParam, lParam) case win.WM_KEYUP: wb.handleKeyUp(wParam, lParam) case win.WM_SIZE, win.WM_SIZING: wb.sizeChangedPublisher.Publish() case win.WM_DESTROY: switch w := wb.window.(type) { case *ToolTip: case Widget: globalToolTip.RemoveTool(w) } delete(hwnd2WindowBase, hwnd) wb.hWnd = 0 wb.window.Dispose() } if window := windowFromHandle(hwnd); window != nil { origWndProcPtr := window.AsWindowBase().origWndProcPtr if origWndProcPtr != 0 { return win.CallWindowProc(origWndProcPtr, hwnd, msg, wParam, lParam) } } return win.DefWindowProc(hwnd, msg, wParam, lParam) }