cef-browser-window-lcl_windows.go 5.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under GNU General Public License v3.0
//
//----------------------------------------

//go:build windows
// +build windows

package cef

14
import (
15 16 17 18
	"github.com/energye/golcl/lcl"
	"github.com/energye/golcl/lcl/rtl"
	"github.com/energye/golcl/lcl/rtl/version"
	"github.com/energye/golcl/lcl/types"
19
	"github.com/energye/golcl/lcl/win"
20
)
21

22 23
var ov = version.OSVersion

24 25
//显示标题栏
func (m *LCLBrowserWindow) ShowTitle() {
26
	m.WindowProperty()._CanHideCaption = false
27 28 29 30
	//win.SetWindowLong(m.Handle(), win.GWL_STYLE, uintptr(win.GetWindowLong(m.Handle(), win.GWL_STYLE)|win.WS_CAPTION))
	//win.SetWindowPos(m.Handle(), m.Handle(), 0, 0, 0, 0, win.SWP_NOSIZE|win.SWP_NOMOVE|win.SWP_NOZORDER|win.SWP_NOACTIVATE|win.SWP_FRAMECHANGED)
	m.SetBorderStyle(types.BsSizeable)

31 32 33 34
}

//隐藏标题栏
func (m *LCLBrowserWindow) HideTitle() {
35
	m.WindowProperty()._CanHideCaption = true
36 37 38 39
	//win.SetWindowLong(m.Handle(), win.GWL_STYLE, uintptr(win.GetWindowLong(m.Handle(), win.GWL_STYLE)&^win.WS_CAPTION))
	//win.SetWindowPos(m.Handle(), 0, 0, 0, m.Width(), m.Height()+500, win.SWP_NOMOVE|win.SWP_NOZORDER|win.SWP_NOACTIVATE|win.SWP_FRAMECHANGED|win.SWP_DRAWFRAME)
	m.SetBorderStyle(types.BsNone)

40
}
41

42 43
//windows 窗口标题栏管理
var wdrs = &windowCaption{}
44

45
type windowCaption struct {
46 47 48
	canCaption bool
}

49
func (m *windowCaption) toPoint(message *types.TMessage) (x, y int32) {
50 51 52 53
	return int32(message.LParam & 0xFFFF), int32(message.LParam & 0xFFFF0000 >> 16)
}

//鼠标在标题栏区域
54
func (m *windowCaption) isCaption(hWND types.HWND, rgn *HRGN, message *types.TMessage) (x, y int32, caption bool) {
55 56 57 58 59 60 61 62 63 64 65 66 67
	dx, dy := m.toPoint(message)
	p := &types.TPoint{
		X: dx,
		Y: dy,
	}
	WinScreenToClient(hWND, p)
	m.canCaption = WinPtInRegion(rgn, p.X, p.Y)
	return p.X, p.Y, m.canCaption
}

func (m *LCLBrowserWindow) doOnRenderCompMsg(message *types.TMessage, lResult *types.LRESULT, aHandled *bool) {
	if m.regions != nil && m.regions.RegionsCount() > 0 {
		switch message.Msg {
68
		case WM_NCLBUTTONDBLCLK: /*-- NC l d click --*/
69
			if !m.WindowProperty().CanCaptionDClkMaximize {
70
				return
71 72 73 74 75 76
			}
			if m.rgn != nil && wdrs.canCaption {
				//SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); // 最大化
				//SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); // 最小化
				//SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // 关闭
				//SendMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); // 最大化状态还原
77 78 79 80 81
				*lResult = HTCAPTION
				*aHandled = true
				win.ReleaseCapture()
				m.windowsState = m.WindowState()
				if m.windowsState == types.WsNormal {
82
					rtl.PostMessage(m.Handle(), WM_SYSCOMMAND, SC_MAXIMIZE, 0)
83
				} else {
84
					rtl.PostMessage(m.Handle(), WM_SYSCOMMAND, SC_RESTORE, 0)
85
				}
86
				rtl.SendMessage(m.Handle(), WM_NCLBUTTONUP, HTCAPTION, 0)
87
			}
88
		case WM_NCLBUTTONDOWN: //nc l down
89 90 91 92
			if m.rgn != nil && wdrs.canCaption {
				*lResult = HTCAPTION
				*aHandled = true
				win.ReleaseCapture()
93
				rtl.PostMessage(m.Handle(), WM_NCLBUTTONDOWN, HTCAPTION, 0)
94
			}
95
		case WM_NCLBUTTONUP: //nc l up
96
			if m.rgn != nil && wdrs.canCaption {
97 98
				*lResult = HTCAPTION
				*aHandled = true
99
			}
100
		case WM_NCRBUTTONDOWN: //nc r down
101 102
			if m.rgn != nil && wdrs.canCaption {
			}
103
		case WM_NCRBUTTONUP: //nc r up
104 105
			if m.rgn != nil && wdrs.canCaption {
			}
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
		case WM_NCHITTEST: /*-- NCHITTEST --*/
			if m.rgn != nil {
				_, _, caption := wdrs.isCaption(m.Handle(), m.rgn, message)
				//设置鼠标坐标是否在标题区域
				wdrs.canCaption = caption
				if caption {
					//如果光标在一个可拖动区域内,返回HTCAPTION允许拖动。
					*lResult = HTCAPTION
					*aHandled = true
				}
			}
		}
	}
}

121 122 123 124 125 126 127 128 129 130 131 132
func (m *LCLBrowserWindow) setDraggableRegions() {
	if m.regions.RegionsCount() > 0 {
		if m.rgn != nil {
			WinDeleteObject(m.rgn)
			m.rgn.Free()
		}
		m.rgn = WinCreateRectRgn(0, 0, 0, 0)
		WinSetDraggableRegions(m.rgn, m.regions.Regions())
	}
}

// default event register: windows CompMsgEvent
133 134 135 136 137 138 139 140 141 142 143
func (m *LCLBrowserWindow) registerWindowsCompMsgEvent() {
	var bwEvent = BrowserWindow.browserEvent
	if m.WindowProperty().CanWebkitAppRegion {
		m.chromium.SetOnRenderCompMsg(func(sender lcl.IObject, message *types.TMessage, lResult *types.LRESULT, aHandled *bool) {
			if bwEvent.onRenderCompMsg != nil {
				bwEvent.onRenderCompMsg(sender, message, lResult, aHandled)
			}
			if !*aHandled {
				m.doOnRenderCompMsg(message, lResult, aHandled)
			}
		})
144 145 146 147 148
		m.windowResize = func(sender lcl.IObject) bool {
			if m.WindowState() == types.WsMaximized && (m.WindowProperty()._CanHideCaption || m.BorderStyle() == types.BsNone || m.BorderStyle() == types.BsSingle) {
				var monitor = m.Monitor().WorkareaRect()
				m.SetBounds(monitor.Left, monitor.Top, monitor.Right-monitor.Left, monitor.Bottom-monitor.Top)
				m.SetWindowState(types.WsMaximized)
149
			}
150 151
			return false
		}
152 153 154 155 156 157
	} else {
		if bwEvent.onRenderCompMsg != nil {
			m.chromium.SetOnRenderCompMsg(bwEvent.onRenderCompMsg)
		}
	}
}
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173

//for windows maximize and restore
func (m *LCLBrowserWindow) Maximize() {
	if m.TForm == nil {
		return
	}
	QueueAsyncCall(func(id int) {
		win.ReleaseCapture()
		m.windowsState = m.WindowState()
		if m.windowsState == types.WsNormal {
			rtl.PostMessage(m.Handle(), WM_SYSCOMMAND, SC_MAXIMIZE, 0)
		} else {
			rtl.SendMessage(m.Handle(), WM_SYSCOMMAND, SC_RESTORE, 0)
		}
	})
}