.NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果
Windows7提供了许多不错的用户体验,诸如窗体背景透明、玻璃磨砂效果、任务栏的JumpList定义以及任务栏进度条显示等等。伴随着这些特效的出现,Windows在底层也提供了相应的API支持,使得开发人员可以根据需要非常容易地在自己的应用程序中实现这些效果。如果你是原生的C++追随者,那恭喜你了!你完全可以毫无障碍地去使用这些API,前提是你需要阅读庞大的开发文档。如果你是新生的.NET开发人员(姑且还是将.NET developer称之为新生者吧,毕竟咱比C++出来得晚),也没有关系,微软在msdn网站中也发布了专门的Windows7 API托管类库,专门用于在.NET应用程序中调用。先来看看IE浏览器在Windows 7下下载文件时任务栏的进度条显示吧,相信很多人都不会陌生,如果你还闻所未闻,要么是你已经out了要么就是你从来就没有关注过Windows 7的这些细节。
要在你自己的.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;
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 += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(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相关的功能外,程序可以继续工作,因此你需要在程序中考虑各种不同环境下的应用,这个是需要思考的东西。