func NewMainWindow() (*MainWindow, error) { mw := new(MainWindow) if err := InitWindow( mw, nil, mainWindowWindowClass, win.WS_OVERLAPPEDWINDOW, win.WS_EX_CONTROLPARENT); err != nil { return nil, err } succeeded := false defer func() { if !succeeded { mw.Dispose() } }() mw.SetPersistent(true) var err error if mw.menu, err = newMenuBar(); err != nil { return nil, err } if !win.SetMenu(mw.hWnd, mw.menu.hMenu) { return nil, lastError("SetMenu") } if mw.toolBar, err = NewToolBar(mw); err != nil { return nil, err } mw.toolBar.parent = nil mw.Children().Remove(mw.toolBar) mw.toolBar.parent = mw win.SetParent(mw.toolBar.hWnd, mw.hWnd) if mw.statusBar, err = NewStatusBar(mw); err != nil { return nil, err } mw.statusBar.parent = nil mw.Children().Remove(mw.statusBar) mw.statusBar.parent = mw win.SetParent(mw.statusBar.hWnd, mw.hWnd) // This forces display of focus rectangles, as soon as the user starts to type. mw.SendMessage(win.WM_CHANGEUISTATE, win.UIS_INITIALIZE, 0) succeeded = true return mw, nil }
func (tw *TabWidget) onInsertedPage(index int, page *TabPage) (err error) { item := tw.tcitemFromPage(page) if idx := int(win.SendMessage(tw.hWndTab, win.TCM_INSERTITEM, uintptr(index), uintptr(unsafe.Pointer(item)))); idx == -1 { return newError("SendMessage(TCM_INSERTITEM) failed") } page.SetVisible(false) style := uint32(win.GetWindowLong(page.hWnd, win.GWL_STYLE)) if style == 0 { return lastError("GetWindowLong") } style |= win.WS_CHILD style &^= win.WS_POPUP win.SetLastError(0) if win.SetWindowLong(page.hWnd, win.GWL_STYLE, int32(style)) == 0 { return lastError("SetWindowLong") } if win.SetParent(page.hWnd, tw.hWnd) == 0 { return lastError("SetParent") } if tw.pages.Len() == 1 { page.SetVisible(true) tw.SetCurrentIndex(0) } tw.resizePages() page.tabWidget = tw return }
// InitWidget initializes a Widget. func InitWidget(widget Widget, parent Window, className string, style, exStyle uint32) error { if parent == nil { return newError("parent cannot be nil") } if err := InitWindow(widget, parent, className, style|win.WS_CHILD, exStyle); err != nil { return err } if container, ok := parent.(Container); ok { if container.Children() == nil { // Required by parents like MainWindow and GroupBox. if win.SetParent(widget.Handle(), container.Handle()) == 0 { return lastError("SetParent") } } else { if err := container.Children().Add(widget); err != nil { return err } } } return nil }
// SetParent sets the parent of the WidgetBase and adds the WidgetBase to the // Children list of the Container. func (wb *WidgetBase) SetParent(parent Container) (err error) { if parent == wb.parent { return nil } style := uint32(win.GetWindowLong(wb.hWnd, win.GWL_STYLE)) if style == 0 { return lastError("GetWindowLong") } if parent == nil { style &^= win.WS_CHILD style |= win.WS_POPUP if win.SetParent(wb.hWnd, 0) == 0 { return lastError("SetParent") } win.SetLastError(0) if win.SetWindowLong(wb.hWnd, win.GWL_STYLE, int32(style)) == 0 { return lastError("SetWindowLong") } } else { style |= win.WS_CHILD style &^= win.WS_POPUP win.SetLastError(0) if win.SetWindowLong(wb.hWnd, win.GWL_STYLE, int32(style)) == 0 { return lastError("SetWindowLong") } if win.SetParent(wb.hWnd, parent.Handle()) == 0 { return lastError("SetParent") } } b := wb.Bounds() if !win.SetWindowPos( wb.hWnd, win.HWND_BOTTOM, int32(b.X), int32(b.Y), int32(b.Width), int32(b.Height), win.SWP_FRAMECHANGED) { return lastError("SetWindowPos") } oldParent := wb.parent wb.parent = parent var oldChildren, newChildren *WidgetList if oldParent != nil { oldChildren = oldParent.Children() } if parent != nil { newChildren = parent.Children() } if newChildren == oldChildren { return nil } widget := wb.window.(Widget) if oldChildren != nil { oldChildren.Remove(widget) } if newChildren != nil && !newChildren.containsHandle(wb.hWnd) { newChildren.Add(widget) } return nil }