【问题标题】:Chromium Embedded (CEF) - Splash ScreenChromium Embedded (CEF) - 启动画面
【发布时间】:2015-03-24 23:08:41
【问题描述】:

我正在修改一个 cefsimple 应用程序以满足我的需求。我在后台有一个很长的启动线程,所以需要一段时间才能显示网页(5-10 秒)。与此同时,我想在呈现主页之前显示某种闪屏,或者至少显示一些 HTML。最好的(或任何)方法是什么?

提前致谢!

【问题讨论】:

    标签: splash-screen chromium chromium-embedded


    【解决方案1】:

    我们将一个 html 文件编译到我们的应用程序中,并将该 URL 传递给 CefBrowserHost::CreateBrowserSync()。

    请参阅 cefclient 示例中的 resource_util_win.cpp,特别是 GetResourceId(),用于将 URL 关联到已编译的资源 ID。

    同时,我们的 splashscreen.html 的主体有

    <body class="splash" onload=" pageLoad() ">
    

    pageLoad() 看起来像

            function pageLoad() {
                window.location = "www.yourrealurl.com";
                }          
            }
    

    我们的启动画面有一个由样式表设置的背景和一个动画 gif,一旦请求的 url 进入,它就会消失。

    如果您已经获得了服务器响应,但渲染需要很长时间,这将无济于事。我们在加载的页面中使用 Angular 来隐藏它,直到它完成加载它的依赖项。

    <div ng-cloak class="ng-cloak" ng-if="IsInitDone()">
    

    【讨论】:

    • 感谢您的回答。它已经给了我一个很好的主意,但是如果您不介意,请提供更多详细信息,也许还有代码示例(对不起,我对 CEF 完全陌生,并且来自 Java 世界)。例如,如何读取和传递 splashscreen.html。如果服务器(实际上是嵌入式 JVM)还没有回复 www.yourrealurl.com,但几秒钟后会回复,会发生什么?谢谢!
    • 在 windows 上,我们将 SplashScreen.html、animated.gif 和 site.css 样式表作为标准 windows 资源编译到应用程序中。
    • 啊,编辑超时。我在回答中对 GetResourceHandle() 不正确(我已经对其进行了编辑),您想要做的与 cefclient 示例在 resource_util_win.cpp 中所做的相同,请参阅他们的 GetResourceId() 和 LoadBinaryResource() 函数。
    • 如果您的嵌入式 JVM 在几秒钟内没有回复,如果响应完成,您应该没问题 - 启动屏幕应该保持可见,直到您从启动屏幕加载的页面加载。如果您提供部分结果,您可能希望在所有数据可用之前保持响应。
    • 如果您在初始屏幕正文中调用 onLoad() 到客户端中的某些 Javascript 以实际启动 JVM,而不是在客户端中显式启动它,怎么样?所以添加类似 window.startJVM();到答案中的那个 pageLoad() 函数。当然,您必须在 CEF 客户端中设置 JS 方法,但您可能已经在做其中的一些,如果不难,CEF 文档中有详细记录。