vf-browser.go 5.5 KB
Newer Older
yanghye's avatar
yanghye 已提交
1 2 3 4 5 6 7 8
//----------------------------------------
//
// Copyright © yanghy. All Rights Reserved.
//
// Licensed under GNU General Public License v3.0
//
//----------------------------------------

yanghye's avatar
yanghye 已提交
9 10 11
package main

import (
12
	"embed"
13
	"fmt"
yanghye's avatar
yanghye 已提交
14
	"github.com/energye/energy/cef"
15
	"github.com/energye/energy/common/assetserve"
16
	"github.com/energye/golcl/lcl"
yanghye's avatar
yanghye 已提交
17
	"time"
yanghye's avatar
yanghye 已提交
18 19
)

20 21 22
//go:embed resources
var resources embed.FS

yanghye's avatar
yanghye 已提交
23 24
func main() {
	//全局初始化 每个应用都必须调用的
25
	cef.GlobalInit(nil, &resources)
yanghye's avatar
yanghye 已提交
26
	//创建应用
27 28 29
	config := cef.NewApplicationConfig()
	config.SetMultiThreadedMessageLoop(false)
	config.SetExternalMessagePump(false)
30
	config.SetRemoteDebuggingPort(33333)
31
	cefApp := cef.NewApplication(config)
yanghye's avatar
yanghye 已提交
32
	//指定一个URL地址,或本地html文件目录
33
	cef.BrowserWindow.Config.Url = "http://localhost:22022/index.html"
34
	cef.BrowserWindow.Config.IconFS = "resources/icon.png"
35
	cef.BrowserWindow.Config.EnableWebkitAppRegion = true
36
	cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
37
		//window.DisableResize()
yanghye's avatar
yanghye 已提交
38
		window.SetCenterWindow(true)
39
		window.SetTitle("这里改变了窗口标题")
yanghye's avatar
yanghye 已提交
40
		window.SetSize(1024, 900)
41
		fmt.Println("cef.BrowserWindow.SetViewFrameBrowserInit", window)
42
		fmt.Println("LCL", window.AsLCLBrowserWindow(), "VF", window.AsViewsFrameworkBrowserWindow())
43 44
		event.SetOnDraggableRegionsChanged(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, regions *cef.TCefDraggableRegions) {
			fmt.Println("SetOnDraggableRegionsChanged", regions.RegionsCount(), "frame:", frame.Id, frame.Url)
45
		})
46 47
		event.SetOnBeforePopup(func(sender lcl.IObject, browser *cef.ICefBrowser, frame *cef.ICefFrame, beforePopupInfo *cef.BeforePopupInfo, popupWindow cef.IBrowserWindow, noJavascriptAccess *bool) bool {
			fmt.Println("IsViewsFramework:", popupWindow.IsViewsFramework())
48
			popupWindow.SetTitle("修改了标题: " + beforePopupInfo.TargetUrl)
49
			popupWindow.EnableResize()
yanghye's avatar
yanghye 已提交
50 51 52
			popupWindow.DisableMaximize()
			popupWindow.DisableResize()
			popupWindow.DisableMinimize()
yanghye's avatar
yanghye 已提交
53
			popupWindow.SetSize(1000, 1000)
54
			browserWindow := popupWindow.AsViewsFrameworkBrowserWindow()
55 56 57
			browserWindow.SetOnWindowCreated(func(sender lcl.IObject, window *cef.ICefWindow) {
				fmt.Println("popupWindow.SetOnWindowCreated", window)
			})
yanghye's avatar
yanghye 已提交
58 59 60
			browserWindow.SetOnGetInitialBounds(func(sender lcl.IObject, window *cef.ICefWindow, aResult *cef.TCefRect) {
				fmt.Println("popupWindow.SetOnGetInitialBounds", *aResult)
			})
61 62
			//browserWindow.BrowserWindow().CreateTopLevelWindow()
			//browserWindow.BrowserWindow().HideTitle()
63
			fmt.Println("browserWindow:", browserWindow, browserWindow.WindowComponent().WindowHandle())
64 65
			return false
		})
66 67 68
		window.AsViewsFrameworkBrowserWindow().WindowComponent().SetOnWindowActivationChanged(func(sender lcl.IObject, window *cef.ICefWindow, active bool) {
			fmt.Println("SetOnWindowActivationChanged", active)
		})
69
		window.Show()
70
		fmt.Println("SetBrowserInit 结束")
71
	})
72 73 74
	cef.BrowserWindow.SetBrowserInitAfter(func(window cef.IBrowserWindow) {
		bw := window.AsViewsFrameworkBrowserWindow().BrowserWindow()
		fmt.Println("handle", bw.WindowComponent().WindowHandle().ToPtr())
75 76
		//设置隐藏窗口标题
		//window.HideTitle()
77
		fmt.Println("SetBrowserInitAfter 结束")
yanghye's avatar
yanghye 已提交
78
		sysTray(window)
79
	})
80 81 82 83 84 85 86 87 88 89 90 91
	//在主进程启动成功之后执行
	//在这里启动内置http服务
	//内置http服务需要使用 go:embed resources 内置资源到执行程序中
	cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022               //服务端口号
		server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
		server.Assets = &resources
		go server.StartHttpServer()
	})
yanghye's avatar
yanghye 已提交
92 93 94
	//运行应用
	cef.Run(cefApp)
}
95

yanghye's avatar
yanghye 已提交
96 97 98 99 100 101
func sysTray(browserWindow cef.IBrowserWindow) {
	sysTray := browserWindow.NewSysTray()
	sysTray.SetIconFS("resources/icon.ico")
	sysTray.SetHint("中文hint\n换行中文")
	sysTray.SetOnClick(func() {
		fmt.Println("SetOnClick")
102
	})
yanghye's avatar
yanghye 已提交
103 104 105 106 107
	tray := sysTray.AsSysTray()
	check := tray.AddMenuItem("check")
	check.Check()
	not := tray.AddMenuItem("通知")
	not.Click(func() {
yanghye's avatar
yanghye 已提交
108
		tray.Notice("标题", "内notice 是一个跨平台的系统通知库\nnotice 是一个跨平台的系统通知库", 1000)
109
	})
yanghye's avatar
yanghye 已提交
110 111 112
	enable := tray.AddMenuItem("启用/禁用")
	enable.Click(func() {
		fmt.Println("启用/禁用 点击")
113
	})
yanghye's avatar
yanghye 已提交
114 115 116
	tray.AddSeparator()
	menuItem := tray.AddMenuItem("1级菜单1", func() {
		fmt.Println("1级菜单1")
117
	})
yanghye's avatar
yanghye 已提交
118 119 120 121 122 123 124 125 126 127
	menuItem.SetIconFS("resources/icon.ico")
	tray.AddSeparator()
	item := tray.AddMenuItem("1级菜单2")
	item.AddSubMenu("2级子菜单1")
	sub2Menu := item.AddSubMenu("2级子菜单2")
	sub2Menu.AddSubMenu("3级子菜单1")
	tray.AddSeparator()
	tray.AddMenuItem("退出", func() {
		fmt.Println("退出")
		browserWindow.CloseBrowserWindow()
128
	})
yanghye's avatar
yanghye 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

	sysTray.Show()
	return
	//测试图标切换
	go func() {
		var b bool
		for {
			time.Sleep(time.Second * 2)
			b = !b
			if b {
				sysTray.SetHint(fmt.Sprintf("%d\n%v", time.Now().Second(), b))
				sysTray.SetIconFS("resources/icon_1.ico")
				menuItem.SetIconFS("resources/icon_1.ico")
				enable.SetLabel(fmt.Sprintf("%d\n%v", time.Now().Second(), b))
				enable.Enable()
				check.Check()
			} else {
				sysTray.SetHint(fmt.Sprintf("%d\n%v", time.Now().Second(), b))
				sysTray.SetIconFS("resources/icon.ico")
				menuItem.SetIconFS("resources/icon.ico")
				enable.SetLabel(fmt.Sprintf("%d\n%v", time.Now().Second(), b))
				enable.Disable()
				check.Uncheck()
			}
		}
	}()
155
}