要在你自己的.NET应用程序中实现这个效果仅仅靠现有的.NET类库是不够的,必须要借助于Windows 7 API的支持。有关在托管代码中调用Windows 7 API可以看微软msdn上的一篇文章,http://archive.msdn.microsoft.com/WindowsAPICodePack。首先需要下载并安装Windows_API_Code_Pack_Self_Extractor,其实就是一个压缩包,里面包含了所有的源代码以及大量的示例,并附有文档可以查阅,非常详细。不过使用这些类库有几个前提条件:
1. .NET Framework的版本必须是3.5SP1及以上。
2. 运行的环境必须是在Windows 7 RTM及其相关版本,在Vista下部分功能可用。
3. 需要DirectX的支持。
下面是我用这些类库实现的一个效果,包含了窗体透明玻璃磨砂效果以及任务栏进度条显示。
实现的代码很简单,但前提是你引用了WindowsAPICodePack的相关类库。
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.WindowsAPICodePack.Taskbar; //使用进度条控件效果必需
using Microsoft.WindowsAPICodePack.Shell; //使用GlassForm必需
namespace VerticalProgressBar
{
public partial class Form1 : GlassForm
{
protected BackgroundWorker worker = null;
public Form1()
{
InitializeComponent();
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged +=
worker.RunWorkerCompleted +=
worker.RunWorkerAsync();
}
void worker_RunWorkerCompleted
(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show( "Complete!");
}
void worker_ProgressChanged
(object sender, ProgressChangedEventArgs e)
{
this.progressBar2.Value = e.ProgressPercentage;
TaskbarManager.Instance.SetProgressValue(this.progressBar2.Value,
this.progressBar2.Maximum);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int count = 100;
for (int i = 0; i <= count; i++)
{
Thread.Sleep(100);
worker.ReportProgress(i);
}
}
}
}
工程中引入了Microsoft.WindowsAPICodePack.dll和 Microsoft.WindowsAPICodePack.Shell.dll。如果想让窗体呈现透明背景的玻璃磨砂效果,需要将窗体的类继承自 Microsoft.WindowsAPICodePack.Shell.GlassForm。另外,在worker_ProgressChanged事 件处理方法中,除了更新窗体上的ProgressBar外,我们还通过 TaskbarManager.Instance.SetProgressValue方法来更新Windows任务栏的进度条显示。
有了这个功能强大的托管类库的支持,可以非常方便地调用Windows7的API来实现那些非常酷的效果。不过这里 有一个小问题需要解决,当你在你的应用程序中使用了这个类库并且在Windows7下实现了想要的效果,如果用户运行的Windows环境是XP或 2003,那么你的程序会抛出异常,类似于下面的截图。

其实除了Windows API相关的功能外,程序可以继续工作,因此你需要在程序中考虑各种不同环境下的应用,这个是需要思考的东西。