// 为窗口设置新的尺寸 func win_handler_sizeTo(browser *cef.Browser, args []cef.V8Value) (result interface{}) { fmt.Println("win_handler_sizeTo") width := cef.V8ValueToInt32(args[0]) height := cef.V8ValueToInt32(args[1]) h := win.HWND(browser.GetWindowHandle()) var rect win.RECT win.GetWindowRect(h, &rect) fmt.Printf("win_handler_sizeTo Left=%v,Right=%v,Width=%v,Height=%v\n", rect.Left, rect.Top, width, height) win.MoveWindow(h, rect.Left, rect.Top, width, height, true) //result = 1 return }
// 为窗口设置新的位置 func win_handler_moveTo(browser *cef.Browser, args []cef.V8Value) (result interface{}) { fmt.Println("win_handler_moveTo") left := cef.V8ValueToInt32(args[0]) top := cef.V8ValueToInt32(args[1]) fmt.Printf("win_handler_moveTo left=%v,top=%v\n", left, top) h := win.HWND(browser.GetWindowHandle()) var rect win.RECT win.GetWindowRect(h, &rect) width := int32(rect.Right - rect.Left) height := int32(rect.Bottom - rect.Top) fmt.Printf("win_handler_moveTo Left=%v,Right=%v,Width=%v,Height=%v\n", left, top, width, height) win.MoveWindow(h, left, top, width, height, true) return }
// 创建浏览器窗口 func (a *Application) CreateBrowserWindow(url string, captionless bool) (err error) { var dwExStyle, dwStyle uint32 = 0, 0 var captionlessFlag uintptr = 0 fmt.Printf("CreateBrowserWindow url=%v captionless=%v\n", url, captionless) if captionless { captionlessFlag = 1 //dwExStyle = 0//win.WS_EX_LAYERED // 无边框效果不错。但是不能移动 //dwStyle = win.WS_POPUP //& ^ (win.WS_CAPTION | win.WS_BORDER) dwStyle = win.WS_MINIMIZEBOX | win.WS_MAXIMIZEBOX | win.WS_CAPTION | win.WS_CLIPCHILDREN | win.WS_SYSMENU | win.WS_POPUP } else { dwStyle = win.WS_OVERLAPPEDWINDOW } if !manifest.FormFixed() { dwStyle |= win.WS_SIZEBOX } // 获取屏幕宽度和高度 var x, y int32 var width, height int32 width = manifest.Width() height = manifest.Height() x = (win.GetSystemMetrics(win.SM_CXSCREEN) - width) / 2 y = (win.GetSystemMetrics(win.SM_CYSCREEN)-height)/2 - 2 renderWindow := win.CreateWindowEx( dwExStyle, syscall.StringToUTF16Ptr(nguiTransparentWindowClass), nil, dwStyle, //|win.WS_CLIPSIBLINGS, x, //win.CW_USEDEFAULT, y, //win.CW_USEDEFAULT, width, //win.CW_USEDEFAULT, height, //win.CW_USEDEFAULT, 0, //hwndParent 0, 0, //hInstance nil) if renderWindow == 0 { err = errors.New("CreateWindowEx") return } // 设置captionless标记 win.SetProp(renderWindow, WindowProp_CaptionLess, win.HANDLE(captionlessFlag)) if captionless { /* SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~(WS_BORDER)); */ // WS_BORDER Creates a window that has a border.创建一个有边界的窗口。 // WS_EX_CLIENTEDGE Specifies that a window has a 3D look — that is, a border with a sunken edge.指定窗口具有3D外观,也即是一个下层的边缘。 //gwlStyle := win.GetWindowLong(renderWindow, win.GWL_STYLE) //gwlStyle &= ^(win.WS_BORDER) //gwlStyle &= ^(win.WS_EX_CLIENTEDGE) //win.SetWindowLong(renderWindow, win.GWL_STYLE, gwlStyle) //gwlExStyle := win.GetWindowLong(renderWindow, win.GWL_EXSTYLE) //gwlExStyle |= win.WS_EX_LAYERED; //win.SetWindowLong(renderWindow, win.GWL_EXSTYLE, gwlExStyle) // HWND hWnd: 窗口句柄 // COLORREF col: 透明化颜色 // byte bAlpha: =0:整个窗口透明, =255 完全不透明 // uint32 dwFlags: =1:仅颜色 col 透明, =2 :窗口按照bAlpha变量进行透明处理。 //win.SetLayeredWindowAttributes(renderWindow, win.BS_SOLID, 0, 2) //win.UpdateWindow(renderWindow) } if captionless { //win.MoveWindow(renderWindow, x, y, width, height, false) //win.SetWindowPos(renderWindow, 0, x, y, width, height, win.SWP_NOZORDER|win.SWP_NOACTIVATE|win.SWP_NOSIZE) win.SetWindowPos(renderWindow, 0, x, y, width, height, win.SWP_FRAMECHANGED) } else { win.MoveWindow(renderWindow, x, y, width, height, false) } fmt.Printf("CreateBrowserWindow x=%v, y=%v, width=%v, height=%v\n", x, y, width, height) go func() { //browser := cef.CreateBrowser(unsafe.Pointer(hwnd), &browserSettings, url, false) browserSettings := cef.BrowserSettings{} cef.CreateBrowser(unsafe.Pointer(renderWindow), &browserSettings, url, false) //m_dwStyle = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP | // WS_VISIBLE; cef.WindowResized(unsafe.Pointer(renderWindow)) win.ShowWindow(renderWindow, win.SW_SHOW) //win.SW_SHOW win.UpdateWindow(renderWindow) //cef.WindowResized(unsafe.Pointer(renderWindow)) // It should be enough to call WindowResized after 10ms, // though to be sure let's extend it to 100ms. //time.AfterFunc(time.Millisecond*100, func() { // cef.WindowResized(unsafe.Pointer(renderWindow)) //}) }() return }
func (w *WindowBase) SetBounds(value Rect) { win.MoveWindow(w.hwnd, int32(value.X), int32(value.Y), int32(value.Width), int32(value.Height), true) }