第二人生的源码分析(七十一)实现闪屏窗口
现在的电子信息技术发展得很快,特别像CPU这样的硬件,已经进入到多核时代,运行程序的速度比以前快了很多,但人类的需求是无止境的,因此写的程序也越来越大,越来越复杂,导致程序的初始化时,就变得比原来更加漫长。在人机交互理论里,让人等待超过10秒的时间,心情就会变得急躁,感觉这个程序不好用。那么有什么方法解决这个问题呢?在我们的社会里,到处都有排队等待的现象,比如让你去银行办理业务,如果让你站在那里等着,没有任何电视或报纸看,感觉时间需要很长。这里通过看电视和报纸,让人感觉到时间不长。其实还有一个更好的办法,当大家在银行排队时,银行的服务员应立即送上茶、可乐、冰棒等等,让大家一边吃着一边等着,这样排队更加感觉不到时间长了。所以在我们设计程序里,也需要给用户一些“茶、可乐、冰棒”,这就是闪屏窗口。
下面是闪屏窗口的类声明。
#001 class LLSplashScreen
#002 {
#003 public:
构造和析构函数
#004 LLSplashScreen() { };
#005 virtual ~LLSplashScreen() { };
#006
#007
#008 // Call to display the window.
创建一个闪屏窗口。
#009 static LLSplashScreen * create();
显示闪屏窗口。
#010 static void show();
隐藏闪屏窗口。
#011 static void hide();
让闪屏窗口显示新的字符串。
#012 static void update(const char* string);
#013
判断闪屏窗口是否可见。
#014 static bool isVisible();
#015 protected:
重载下面三个函数实现不同平台的代码。比如WINDOWS与LINUX平台就不一样的。
#016 // These are overridden by the platform implementation
#017 virtual void showImpl() = 0;
#018 virtual void updateImpl(const char* string) = 0;
#019 virtual void hideImpl() = 0;
#020
#021 static BOOL sVisible;
#022
#023 };
下面接着分析WINDOWS平台下的实现代码,如下:
#001 //static
#002 void LLSplashScreen::show()
#003 {
#004 if (!gSplashScreenp)
#005 {
#006 #if LL_WINDOWS && !LL_MESA_HEADLESS
#007 gSplashScreenp = new LLSplashScreenWin32;
#008 #elif LL_DARWIN
#009 gSplashScreenp = new LLSplashScreenMacOSX;
#010 #endif
#011 if (gSplashScreenp)
#012 {
#013 gSplashScreenp->showImpl();
#014 }
#015 }
#016 }
上面实现WINDOWS和MAC的创建窗口。在这里主要分析WINDOWS平台的类LLSplashScreenWin32的代码,下一次再来分析它。