要在你自己的.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; 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相关的功能外,程序可以继续工作,因此你需要在程序中考虑各种不同环境下的应用,这个是需要思考的东西。
最新评论