A: demo lcl window mask

This commit is contained in:
杨红岩 2024-04-17 18:25:49 +08:00
parent e5b8e53c41
commit 18cfe18706
4 changed files with 90 additions and 58 deletions

View File

@ -0,0 +1,74 @@
package mask
import (
"fmt"
"github.com/energye/energy/v2/cef"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
"github.com/energye/golcl/lcl/types/colors"
)
type Mask struct {
maskForm *lcl.TForm
gifPlay *cef.TGIFPlay
progressLabel *lcl.TLabel
}
func Create(window *cef.LCLBrowserWindow) *Mask {
var mask = new(Mask)
// 创建一个 form 或 panel、或其它任意 IWinControl 组件模拟遮罩
// form 可以设置透明度
mask.maskForm = lcl.NewForm(window) // form有窗口句柄
mask.maskForm.SetParent(window) // 显示在主窗口里的一个子窗口
mask.maskForm.SetBorderStyle(types.BsNone) // 因为是窗口所以要去掉标签栏效果和panel差不多了
mask.maskForm.SetAlign(types.AlClient) //铺满整个主窗口
mask.maskForm.SetColor(colors.ClSkyblue)
// 这是透明设置只能form, 但是它的子组件也会跟着半透明
mask.maskForm.SetAlphaBlend(true) //透明
mask.maskForm.SetAlphaBlendValue(150) //透明度
mask.maskForm.SetFormStyle(types.FsSystemStayOnTop) //置顶??
// 创建一个gif播放组件
mask.gifPlay = cef.NewGIFPlay(mask.maskForm)
mask.gifPlay.SetParent(mask.maskForm)
//在内置FS中读取gif资源
mem := lcl.NewMemoryStream()
mem.LoadFromFSFile("resources/loading.gif")
//play.LoadFromFile("本地加载") //或本地加载
mask.gifPlay.LoadFromStream(mem)
mem.Free() // stream free
//关闭时释放掉 play 占内存啊
mask.maskForm.SetOnClose(func(sender lcl.IObject, action *types.TCloseAction) {
mask.gifPlay.Animate(false)
mask.gifPlay.Free()
})
mask.progressLabel = lcl.NewLabel(mask.maskForm)
mask.progressLabel.SetParent(mask.maskForm)
mask.progressLabel.Font().SetColor(colors.ClRed)
mask.progressLabel.Font().SetSize(24)
// 居中显示
var center = func(sender lcl.IObject) {
mask.gifPlay.SetLeft(window.Width()/2 - mask.gifPlay.Width()/2)
mask.gifPlay.SetTop(window.Height()/2 - mask.gifPlay.Height()/2)
mask.progressLabel.SetLeft(window.Width()/2 + 80)
mask.progressLabel.SetTop(window.Height()/2 - 20)
}
mask.maskForm.SetOnShow(center)
mask.maskForm.SetOnResize(center)
return mask
}
func (m *Mask) Progress(v int) {
m.progressLabel.SetCaption(fmt.Sprintf("加载进度: %v", v))
}
func (m *Mask) Show() {
m.maskForm.Show()
}
func (m *Mask) Mask() *lcl.TForm {
return m.maskForm
}
func (m *Mask) GIFPlay() *cef.TGIFPlay {
return m.gifPlay
}

View File

@ -15,84 +15,42 @@ import (
"fmt"
"github.com/energye/energy/v2/cef"
_ "github.com/energye/energy/v2/examples/syso"
"github.com/energye/energy/v2/examples/window/masking/mask"
"github.com/energye/golcl/lcl"
"github.com/energye/golcl/lcl/types"
)
//go:embed resources
var resources embed.FS
func main() {
// 打开 GIF 文件
//gifPlay := NewGIFPlay()
//gifPlay.LoadFile("E:\\SWT\\gopath\\src\\github.com\\energye\\energy\\examples\\window\\masking\\resources\\autumn.gif")
//return
//全局初始化 每个应用都必须调用的
cef.GlobalInit(nil, resources)
//创建应用
app := cef.NewApplication()
//指定一个URL地址或本地html文件目录
cef.BrowserWindow.Config.Url = "https://energy.yanghy.cn"
//cef.BrowserWindow.Config.Url = "https://github.com/energye/energy"
cef.BrowserWindow.Config.Url = "https://gitee.com/energye/energy"
cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, window cef.IBrowserWindow) {
if window.IsLCL() {
bw := window.AsLCLBrowserWindow().BrowserWindow()
// 页面呈现组件,默认让它隐藏, 也可不隐藏
part := bw.WindowParent()
part.SetVisible(false)
// 创建一个 form 或 panel、或其它任意 IWinControl 组件模拟遮罩
// form 可以设置透明度,但也没啥用
mask := lcl.NewForm(bw) // form它是有窗口句柄的所以也可以使用 api 调整它
mask.SetParent(bw) // 显示在主窗口里的一个子窗口
mask.SetBorderStyle(types.BsNone) // 因为是窗口所以要去掉标签栏效果和panel差不多了
mask.SetAlign(types.AlClient) //铺满整个主窗口
// 这是透明设置只能form, 但是它的子组件也会跟着半透明
//mask.SetAlphaBlend(true)
//mask.SetAlphaBlendValue(80)
// 创建一个gif播放组件
gifPlay := cef.NewGIFPlay(mask)
gifPlay.SetParent(mask)
gifPlay.LoadFSFile("resources/autumn.gif") // gif图片可能有点要求吧
// 这里是根据 gif 图片实际大小
gifPlay.SetWidth(639)
gifPlay.SetHeight(426)
// 居中显示
gifPlay.SetLeft(bw.Width()/2 - gifPlay.Width()/2)
gifPlay.SetTop(bw.Height()/2 - gifPlay.Height()/2)
// 窗口显示时开始播放gif动画
mask.SetOnShow(func(sender lcl.IObject) {
gifPlay.Start()
})
// 遮罩窗口关闭时停止并释放gif
mask.SetOnClose(func(sender lcl.IObject, action *types.TCloseAction) {
gifPlay.Free()
})
// 显示form
mask.Show()
bw.SetOnResize(func(sender lcl.IObject) bool {
if gifPlay.IsValid() {
gifPlay.SetLeft(bw.Width()/2 - gifPlay.Width()/2)
gifPlay.SetTop(bw.Height()/2 - gifPlay.Height()/2)
}
return false
})
// 页面加载进度
maskForm := mask.Create(bw)
maskForm.Show()
// 页面加载进度, 控制何时关闭遮罩
bw.Chromium().SetOnLoadingProgressChange(func(sender lcl.IObject, browser *cef.ICefBrowser, progress float64) {
v := progress * 100
v := int(progress * 100)
fmt.Println("OnLoadingProgressChange:", v)
if v == 100 {
cef.RunOnMainThread(func() {
// 页面加载进度100%后关闭遮罩层
if mask != nil {
mask.Close()
mask.Free()
mask = nil
// 最后显示浏览器组件
part.SetVisible(true)
// 更新UI组件或状态必须在UI线程中运行
cef.RunOnMainThread(func() {
if maskForm.Mask().IsValid() {
maskForm.Progress(v)
if v == 100 {
maskForm.Mask().Close()
maskForm.Mask().Free()
}
})
}
}
})
})
}
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB