func (pb *PushButton) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_GETDLGCODE: hwndFocus := win.GetFocus() if hwndFocus == pb.hWnd { form := ancestor(pb) if form == nil { break } dlg, ok := form.(dialogish) if !ok { break } defBtn := dlg.DefaultButton() if defBtn == pb { pb.setAndClearStyleBits(win.BS_DEFPUSHBUTTON, win.BS_PUSHBUTTON) return win.DLGC_BUTTON | win.DLGC_DEFPUSHBUTTON } break } pb.ensureProperDialogDefaultButton(hwndFocus) case win.WM_KILLFOCUS: pb.ensureProperDialogDefaultButton(win.HWND(wParam)) } return pb.Button.WndProc(hwnd, msg, wParam, lParam) }
// ColumnsSizable returns if the user can change column widths by dragging // dividers in the header. func (tv *TableView) ColumnsSizable() bool { headerHWnd := win.HWND(tv.SendMessage(win.LVM_GETHEADER, 0, 0)) style := win.GetWindowLong(headerHWnd, win.GWL_STYLE) return style&win.HDS_NOSIZING == 0 }
// SetColumnsSizable sets if the user can change column widths by dragging // dividers in the header. func (tv *TableView) SetColumnsSizable(b bool) error { headerHWnd := win.HWND(tv.SendMessage(win.LVM_GETHEADER, 0, 0)) style := win.GetWindowLong(headerHWnd, win.GWL_STYLE) if b { style &^= win.HDS_NOSIZING } else { style |= win.HDS_NOSIZING } if 0 == win.SetWindowLong(headerHWnd, win.GWL_STYLE, style) { return lastError("SetWindowLong(GWL_STYLE)") } tv.columnsSizableChangedPublisher.Publish() return nil }
func (tv *TableView) setSortIcon(index int, order SortOrder) error { headerHwnd := win.HWND(tv.SendMessage(win.LVM_GETHEADER, 0, 0)) idx := int(tv.toLVColIdx(index)) for i := range tv.visibleColumns() { item := win.HDITEM{ Mask: win.HDI_FORMAT, } iPtr := uintptr(i) itemPtr := uintptr(unsafe.Pointer(&item)) if win.SendMessage(headerHwnd, win.HDM_GETITEM, iPtr, itemPtr) == 0 { return newError("SendMessage(HDM_GETITEM)") } if i == idx { switch order { case SortAscending: item.Fmt &^= win.HDF_SORTDOWN item.Fmt |= win.HDF_SORTUP case SortDescending: item.Fmt &^= win.HDF_SORTUP item.Fmt |= win.HDF_SORTDOWN } } else { item.Fmt &^= win.HDF_SORTDOWN | win.HDF_SORTUP } if win.SendMessage(headerHwnd, win.HDM_SETITEM, iPtr, itemPtr) == 0 { return newError("SendMessage(HDM_SETITEM)") } } return nil }
// 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) }
// 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 { window := windowFromHandle(hwnd) 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_HSCROLL, win.WM_VSCROLL: if window := windowFromHandle(win.HWND(lParam)); window != nil { // The window that sent the notification shall handle it itself. return window.WndProc(hwnd, msg, wParam, lParam) } 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_MOUSEWHEEL: wb.publishMouseWheelEvent(&wb.mouseWheelPublisher, wParam, lParam) case win.WM_SETFOCUS, win.WM_KILLFOCUS: wb.focusedChangedPublisher.Publish() 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_DROPFILES: wb.dropFilesPublisher.Publish(win.HDROP(wParam)) case win.WM_SIZE, win.WM_SIZING: wb.sizeChangedPublisher.Publish() case win.WM_DESTROY: if wb.origWndProcPtr != 0 { // As we subclass all windows of system classes, we prevented the // clean-up code in the WM_NCDESTROY handlers of some windows from // being called. To fix this, we restore the original window // procedure here. win.SetWindowLongPtr(wb.hWnd, win.GWLP_WNDPROC, wb.origWndProcPtr) } delete(hwnd2WindowBase, hwnd) wb.window.Dispose() wb.hWnd = 0 } if window != nil { if wndProc := window.AsWindowBase().origWndProcPtr; wndProc != 0 { return win.CallWindowProc(wndProc, hwnd, msg, wParam, lParam) } } return win.DefWindowProc(hwnd, msg, wParam, lParam) }
func (cb *ContainerBase) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: if lParam == 0 { switch win.HIWORD(uint32(wParam)) { case 0: cmdId := win.LOWORD(uint32(wParam)) switch cmdId { case win.IDOK, win.IDCANCEL: form := ancestor(cb) if form == nil { break } dlg, ok := form.(dialogish) if !ok { break } var button *PushButton if cmdId == win.IDOK { button = dlg.DefaultButton() } else { button = dlg.CancelButton() } if button != nil && button.Visible() && button.Enabled() { button.raiseClicked() } break } // Menu actionId := uint16(win.LOWORD(uint32(wParam))) if action, ok := actionsById[actionId]; ok { action.raiseTriggered() return 0 } case 1: // Accelerator } } else { // The window that sent the notification shall handle it itself. hWnd := win.HWND(lParam) if window := windowFromHandle(hWnd); window != nil { window.WndProc(hwnd, msg, wParam, lParam) return 0 } } case win.WM_NOTIFY: nmh := (*win.NMHDR)(unsafe.Pointer(lParam)) if window := windowFromHandle(nmh.HwndFrom); window != nil { // The window that sent the notification shall handle it itself. return window.WndProc(hwnd, msg, wParam, lParam) } case win.WM_HSCROLL, win.WM_VSCROLL: if window := windowFromHandle(win.HWND(lParam)); window != nil { // The window that sent the notification shall handle it itself. return window.WndProc(hwnd, msg, wParam, lParam) } case win.WM_SIZE, win.WM_SIZING: if cb.layout != nil { cb.layout.Update(false) } } return cb.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func onLButtonDown(nFlags uint32, pPt *xcgui.POINT, pbHandled *bool) int { win.SetFocus(win.HWND(xcgui.XWnd_GetHWND(hWindow))) return 0 }
func (s *Window) Show() { // message handling hwnd := win.HWND(unsafe.Pointer(s.GetHwnd())) win.ShowWindow(hwnd, win.SW_SHOW) win.UpdateWindow(hwnd) }
// 重载,返回炫彩窗口句柄 func (mw *MyMainWindow) Handle() win.HWND { return win.HWND(xcgui.XWnd_GetHWND(mw.hWindow)) }