浏览器窗口 BrowserWindow
描述
BrowserWindow 是基于LCL与VF窗口组件的全局浏览器窗口变量,维护主窗口和子窗口,内部属性在主进程中创建,所以使用时也是在主进程使用。
提供了主窗口对象、子窗口对象的获取,和主窗体初始化回调函数.
提供2种窗口组件
主窗口初始化回调函数 SetBrowserInit
- 参数 event *cef.BrowserEvent 浏览器事件
- 参数 window cef.IBrowserWindow 窗口实例接口
- 不推荐 在该回调函数中创建子LCL组件
//主窗口初始化回调函数
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
//...
})
主窗口初始化后回调函数 SetBrowserInitAfter
- 在窗口激活展示之后回调一次,在这里可以对子组件创建,子窗口创建等
- 不推荐 在这个函数中设置窗口属性和事件,因为窗口已经创建,设置之后可能会有不好的效果
- 推荐 在该回调函数中创建子LCL组件
cef.BrowserWindow.SetBrowserInitAfter(func(window cef.IBrowserWindow) {
//...
})
窗口属性设置 - 参考 WindowProperty
在【SetBrowserInit】初始化函数中设置窗口属性
也可通过 cef.BrowserWindow.Config 提供的一些常用属性设置
获得 window 对象
//获取基于LCL组件创建的窗口, 成功反回非nil
window.AsLCLBrowserWindow()
//获取基于VF组件创建的窗口, 成功返回非nil
window.AsViewsFrameworkBrowserWindow()
窗口图标
//可以使用多种方式加载ico图标到程序窗口中
//1. 内置到执行文件中加载
cef.BrowserWindow.Config.IconFS = "resources/icon.png"
//2. 本地目录加载
cef.BrowserWindow.Config.Icon = "/to/path/icon.png"
//3. lcl的application加载 或 TForm加载
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow){
//lcl的application加载
//lcl.Application.Icon().LoadFromFSFile("resources/icon.ico")
//TForm加载
//window.AsLCLBrowserWindow().BrowserWindow().SetIcon()
})
窗口标题
cef.BrowserWindow.Config.Title = "Energy 跨平台"
窗口大小&坐标
//1. 方式
cef.BrowserWindow.Config.Width = 1024
cef.BrowserWindow.Config.Height = 768
cef.BrowserWindow.Config.X = 100
cef.BrowserWindow.Config.Y = 100
//2. 方式
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow){
window.SetSize(1024, 768)
window.SetPoint(100,100)
})
透明窗口
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow){
//设置并启用窗口透明,参数透明度,取值 0 ~ 255
//仅LCL窗口组件支持,也可通过系统API自定义实现
window.AsLCLBrowserWindow().EnableTransparent(100)
})
更多属性参见 WindowProperty 和 源码与示例
功能函数
窗口功能函数,如未在窗口初始化时操作,此时需要获取窗口信息
在窗口初始化时或自行业务编写时都可使用
在IPC操作中会携带browserId和frameId参数
参考 IPC
LCL窗口和VF窗口有些许不同, 需根据实际情况使用
获得窗口对象
如果你想在html中控制窗口状态,这时你需要获得指定的窗口
//获取窗口 返回: IBrowserWindow
var browserWindow = cef.BrowserWindow.GetWindowInfo(browserId int32)
窗口最小化
Minimize()
禁用/启用最小化按钮
DisableMinimize()
EnableMinimize()
窗口最大化/还原
切换最大化和还原状态
Maximize()
禁用/启用最大化按钮
DisableMaximize()
EnableMaximize()
关闭
Close()
禁用/启用标题栏按钮
DisableSystemMenu()
EnableSystemMenu()
显示
window.SetVisible(true) 或 window.Show()
隐藏
window.SetVisible(false) 或 window.Hide()
获取窗口ID
WindowId() int32
获取Chromium()功能函数
返回浏览器Chromium的功能函数接口
参考 Chromium
Chromium() IChromiumProc
任务栏
默认
以默认的方式展示在任务栏上
SetDefaultInTaskBar()
始终展示
始终展示在任务栏上
SetShowInTaskBar()
不会展示
不会展示在任务栏上
SetNotInTaskBar()
WindowParent
返回chromium的父组件对象,该对象不是window对象,属于window的一个子组件
在windows下它是 TCEFWindowParent, linux或macOSx下它是 TCEFLinkedWindowParent
通过函数可调整该组件的属性
参考 ITCefWindow
WindowParent() ITCefWindow
创建window浏览器组件
在自定义窗口, 并且带有浏览器时使用
用于创建自定义浏览器窗口
ChromiumCreate(config *tCefChromiumConfig, defaultUrl string)
无标题窗口-拖拽
如果设置了无标题栏窗口,这种情况下窗口是无法拖拽的,需要在html中使用设置拖拽区域
设置css属性: -webkit-app-region: drag/no-drag;
- -webkit-app-region: drag 设置该html标签是可拖拽区域
- -webkit-app-region: no-drag 如果拖拽区域标签内有如按钮可操作功能,设置该属性。
- -webkit-user-select: none 不选中文字
- html示例代码
<div style="width: 600px;-webkit-app-region: drag; -webkit-user-select:none; border: 1px solid red;">
这是一个能拖拽窗口的html->div标签
<a href="https://www.baidu.com" target="_blank" style="-webkit-app-region: no-drag">我还能被点击-去百度</a>
<a href="/" target="_blank" style="-webkit-app-region: no-drag">我还能被点击-再打开一个窗口?</a>
<a href="https://energy.yanghy.cn">我不能点击到</a>
</div>
窗口事件-常用事件
默认事件是指 Energy 基于原生事件封装好的事件,默认事件被覆盖将不再生效,某些默认事件被覆盖将会影响应用程序的正常使用。你也可以自己实现一套完整的事件。
调整窗口大小
添加OnResize事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
AddOnResize(func(sender lcl.IObject) bool)
覆盖默认事件
SetOnResize(func(sender lcl.IObject))
窗口激活
添加AddOnActivate事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
AddOnActivate(func(sender lcl.IObject) bool)
覆盖默认事件
SetOnActivate(func(sender lcl.IObject))
窗口激活后
每次激活窗口之后执行一次
SetOnActivateAfter(func(sender IObject))
窗口显示
添加AddOnShow事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
AddOnShow(func(sender lcl.IObject) bool)
覆盖默认事件
SetOnShow(func(sender lcl.IObject))
窗口关闭
添加AddOnClose事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
AddOnClose(func(sender lcl.IObject, action *types.TCloseAction) bool)
覆盖默认事件
SetOnClose(func(sender lcl.IObject, action *types.TCloseAction))
窗口关闭控制
添加AddOnCloseQuery事件,不会覆盖默认事件,返回值:false继续执行默认事件, true跳过默认事件
AddOnCloseQuery(func(sender lcl.IObject, canClose *bool) bool)
覆盖默认事件
SetOnCloseQuery(func(sender lcl.IObject, canClose *bool))
自定义右键菜单
//在SetBrowserInit函数中
//1. 定义菜单
event.SetOnBeforeContextMenu(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, params *cef.ICefContextMenuParams, model *cef.ICefMenuModel) {
//...
})
//2. 菜单事件
event.SetOnContextMenuCommand(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, params *cef.ICefContextMenuParams, commandId consts.MenuId, eventFlags uint32, result *bool) {
//...
})
窗口其它属性、功能、事件参考
请参考: 示例及源码