自线程 Win32 闪屏






4.45/5 (24投票s)
使用 Win32 和 GDI+ 实现一个自线程启动画面,带有进度指示器。
引言
即使使用自己的线程,基于 MFC 的类也可能导致启动画面重绘挂起,同时加载应用程序。这是因为 MFC 在消息队列级别进行同步。因此,应用程序停止响应用户。CSplashWnd
是一个易于使用的启动画面类,它可以始终重绘自身。它使用 Win32 API 实现,但也可以在 MFC 应用程序中使用。
如何使用该类
CSplashWnd
使用 GDI+ 显示图像。它允许您使用各种图像类型,包括 BMP、GIF、JPEG、PNG、TIFF 和 EMF。但是,您需要初始化 GDI+ 库。
// Before using CSplashWnd
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
...
// Somewhere in the end of your program
GdiplusShutdown(gdiplusToken);
使用 CSplashWnd
非常简单。只需将 SplashWnd.cpp 和 SplashWnd.h 添加到您的项目中,然后在您的程序中包含 SplashWnd.h。要初始化启动画面,请使用 CSplashWnd::SetImage
。此方法设置您希望在加载应用程序时看到的图像。它可以如下所示
...
CSplashWnd splash;
splash.SetImage(pImage);
splash.Show();
// ... Some long operation
splash.Hide();
...
启动画面可以在任务栏上有一个按钮。只有在调用 CSplashWnd::SetWindowName
之后再调用 CSplashWnd::Show
时才会创建它。如果启动画面在创建任何窗口之前出现,任务栏上的按钮可能很有用。在这种情况下,用户可以轻松找到应用程序。您可以使用 CSplashWnd::SetProgress
方法指示加载进度。第一次调用 CSplashWnd::SetProgress
会在启动窗口底部创建一个进度控件。它还将进度控件设置为初始状态。所有后续调用只是更新进度状态。
您可以通过将进度阶段的文本描述传递给 CSplashWnd::SetProgress
方法,使用文本字符串或字符串资源 ID 作为附加输入参数,来显示更多加载或计算过程的详细信息。
...
splash.Show()
splash.SetProgress(0, L"Loading...");
for (int i =0; i < 100; ++i)
{
// compute something
// ...
splash.SetProgress(i);
}
splash.SetProgress(100, L"Done.");
...
如果已知加载操作的长度,您将希望使用 CSplashWnd::SetAutoProgress
方法。它使用自己的计时器自动更新进度状态。目前,它每秒更新一次状态。之前的代码现在将如下所示
...
splash.Show()
splash.SetAutoProgress(0, 100, 100);
for (int i =0; i < 100; ++i)
{
// compute something
// here we know that one loop takes one second
}
...
历史
- 2006 年 8 月 9 日 - 该类编写完成。
- 2007 年 5 月 25 日 - 添加了一些同步,并修复了计时器消息 ID。
- 2008 年 6 月 20 日 - 新功能:多显示器支持、文本进度状态、对外部资源句柄的支持。