65.9K
CodeProject 正在变化。 阅读更多。
Home

自线程 Win32 闪屏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (24投票s)

2006 年 9 月 8 日

CDDL

2分钟阅读

viewsIcon

128161

downloadIcon

7204

使用 Win32 和 GDI+ 实现一个自线程启动画面,带有进度指示器。

Sample screenshot

引言

即使使用自己的线程,基于 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.cppSplashWnd.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 日 - 新功能:多显示器支持、文本进度状态、对外部资源句柄的支持。
© . All rights reserved.