A: 增加 LCL 组件窗口可启用/禁用主窗口配置

This commit is contained in:
杨红岩 2023-12-11 20:10:50 +08:00
parent 4aaab92557
commit 1ef8330224
5 changed files with 58 additions and 12 deletions

View File

@ -108,6 +108,7 @@ func (m *TCEFApplication) DoMessageLoopWork() {
}
// RunMessageLoop
// Chrome runtime
func (m *TCEFApplication) RunMessageLoop() {
defer func() {
logger.Debug("application run value loop end")

View File

@ -33,6 +33,8 @@ var (
},
windowInfo: make(map[int32]IBrowserWindow),
}
// disabledMainWindow 如果在Config配置中禁用主窗口(EnableMainWindow=false)时, 使用该窗口替代主窗口
disabledMainWindow *disableMainWindow
browserProcessStartAfterCallback browserProcessStartAfterCallbackFunc
)
@ -86,17 +88,8 @@ func Run(app *TCEFApplication) {
// VF窗口 MessageLoop
application.RunMessageLoop()
} else {
// 创建LCL窗口组件
if BrowserWindow.mainBrowserWindow == nil {
BrowserWindow.mainBrowserWindow = new(lclBrowserWindow)
}
// LCL窗口
//lcl.RunApp(&BrowserWindow.mainBrowserWindow)
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(BrowserWindow.Config.MainFormOnTaskBar)
lcl.Application.CreateForm(&BrowserWindow.mainBrowserWindow, true)
lcl.Application.Run()
// LCL窗口 创建并运行应用
BrowserWindow.createFormAndRun()
//lclwidget.CustomWidgetSetFinalization()
}
}

View File

@ -59,6 +59,38 @@ type lclBrowserWindow struct {
LCLBrowserWindow
}
// disableMainWindow
// 禁用主窗口使用该窗口结构做为主窗口, 该窗口不被显示
type disableMainWindow struct {
*lcl.TForm
}
// 创建LCL窗口并运行应用
func (m *browserWindow) createFormAndRun() {
// 创建LCL窗口组件
if BrowserWindow.mainBrowserWindow == nil {
BrowserWindow.mainBrowserWindow = new(lclBrowserWindow)
}
// LCL窗口
lcl.Application.Initialize()
lcl.Application.SetMainFormOnTaskBar(BrowserWindow.Config.MainFormOnTaskBar)
if m.Config.EnableMainWindow {
lcl.Application.CreateForm(&BrowserWindow.mainBrowserWindow, true)
} else {
lcl.Application.CreateForm(&disabledMainWindow, true)
lcl.Application.SetShowMainForm(false)
}
lcl.Application.Run()
}
// OnFormCreate disableMainWindow
func (m *disableMainWindow) OnFormCreate(sender lcl.IObject) {
// 禁用主窗口后需要创建一个新的窗口来代替主窗口显示
lcl.Application.CreateForm(&BrowserWindow.mainBrowserWindow)
// 显示窗口,此时的主窗口是默认显示的第一个窗口, 如果将该窗口关闭,获取主窗口函数将返回无效的窗口
BrowserWindow.mainBrowserWindow.Show()
}
// OnFormCreate LCL窗口组件窗口创建回调
func (m *lclBrowserWindow) OnFormCreate(sender lcl.IObject) {
m.windowProperty = &BrowserWindow.Config.WindowProperty
@ -69,6 +101,7 @@ func (m *lclBrowserWindow) OnFormCreate(sender lcl.IObject) {
m.ChromiumCreate(BrowserWindow.Config.ChromiumConfig(), BrowserWindow.Config.Url)
m.defaultChromiumEvent()
m.setProperty()
m.SetShowInTaskBar()
if BrowserWindow.Config.browserWindowOnEventCallback != nil {
BrowserWindow.browserEvent.chromium = m.Chromium()
BrowserWindow.Config.browserWindowOnEventCallback(BrowserWindow.browserEvent, m)

View File

@ -63,7 +63,7 @@ type WindowProperty struct {
EnableClose bool // 窗口 关闭时是否关闭窗口 default: true
EnableCenterWindow bool // 窗口 居中显示 default: true
EnableDragFile bool // 窗口 是否允许向窗口内拖拽文件
EnableMainWindow bool // 窗口 是否启用主窗口 default: true
EnableMainWindow bool // 窗口 是否启用主窗口 default: true, 值为false时不再有主子窗口区分
AlwaysOnTop bool // 窗口 窗口置顶
X int32 // 窗口 EnableCenterWindow=false X坐标 default: 100
Y int32 // 窗口 EnableCenterWindow=false Y坐标 default: 100

View File

@ -1010,6 +1010,24 @@ func (m *LCLBrowserWindow) CloseBrowserWindow() {
})
}
// TryCloseWindowAndTerminate
// 尝试关闭窗口并退出应用,
// EnableMainWindow = false
//
// 如果禁用主窗口, 存在多窗口时只在最后一个窗口关闭时才退出整个应用进程
func (m *LCLBrowserWindow) TryCloseWindowAndTerminate() {
if !BrowserWindow.Config.EnableMainWindow {
count := len(BrowserWindow.GetWindowInfos())
if count < 1 {
if m.tray != nil {
m.tray.close()
}
// 窗口数量已经是0个了结束应用
lcl.Application.Terminate()
}
}
}
// close 内部调用
func (m *LCLBrowserWindow) close(sender lcl.IObject, action *types.TCloseAction) {
var ret bool
@ -1023,6 +1041,7 @@ func (m *LCLBrowserWindow) close(sender lcl.IObject, action *types.TCloseAction)
} else if IsWindows() { // windows 子窗口
*action = types.CaHide
}
m.TryCloseWindowAndTerminate()
}
}